SSRS:动态更改SQL语句
-
02-07-2019 - |
题
我在SSRS 2005中有一个基于与此类似的查询的报告:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'
我需要能够根据用户是否选中了复选框,在查询中动态包含WHERE子句的AND部分。基本上,这是一个动态SQL语句,这就是问题所在。我试过几种方法都无济于事。这可能吗? SSRS 2005是否支持动态SQL?谢谢!
解决方案
查尔斯几乎得到了正确的答案。
应该是:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked = 0 OR col2 LIKE '%XYZ%')
这是一个经典的“模式”。在SQL中用于条件谓词。如果 @checked = 0
,则它将返回与谓词的其余部分匹配的所有行( col1 ='ABC'
)。 SQL Server甚至不会处理 OR
的后半部分。
如果 @checked = 1
,它将评估 OR
的第二部分,并返回与 col1 ='ABC'和col2 LIKE'%XYZ匹配的行%'代码>
如果您有多个条件谓词,则可以使用此方法将它们链接在一起(而IF和CASE方法很快就会变得无法管理)。
例如:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
AND (@checked2 = 0 OR col3 LIKE '%MNO%')
不要使用动态SQL,不要使用IF或CASE。
其他提示
这个怎么样? @checked是你的位变量。
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')
编辑另外,如果您没有使用存储过程,请使用存储过程。
也许这对你有用:
if @checked = 1
select * from mytable (nolock) where col = 'ABC'
else
select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'
对不起,我不太多使用SSRS,但是如果你可以在@checked参数中获得复选框的值,那么这应该有效。
或者,您可以使用CASE WHEN语句。
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
这适用于SSRS 2000,但作为最后的手段使用。
(差)PSEUDOCODE
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")
查看执行”动态“ SQL查询。来自Hitchhiker的SQL Server 2000 Reporting Services指南
执行此操作的一种方法是将SSRS查询生成为表达式。在BIDS报表设计器中,将查询设置为:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
如果你可以使用存储过程,那么它可能更容易实现。传递你的参数。根据您的条件创建一个SQL String并对sql字符串执行EXEC,您的存储过程将返回您需要的结果。
您还可以采用其他方法并使用Exec函数:
DECLARE @CommonSelectText varchar(2000)
DECLARE @CompleteSelectText varchar(2000)
SELECT @CommonSelectText = 'SELECT * FROM MyTable (nolock) Where Col = ''ABC'' '
IF @checked = 1
SELECT @CompleteSelectText = @CommonSelectText + ' AND ColW LIKE ''%XYZ%'' '
ELSE
SELECT @CompleteSelectText = @CommonSelectText
EXEC (@CompleteSelectText)
GO
请注意使用两个撇号'
来标记引用的文字。