SSRS:动态更改SQL语句
我在SSRS 2005中有一个基于类似于此查询的查询的报告:
SELECT * FROM MyTable (NOLOCK) WHERE col1 = 'ABC' AND col2 LIKE '%XYZ%'
我需要能够根据用户是否已选中复选框在查询中动态包括WHERE子句的AND部分。基本上,这是一个动态SQL语句,这就是问题所在。我尝试了几种方法都无济于事。这可能吗? SSRS 2005是否支持动态SQL?谢谢!
解决方案
也许这对我们有用:
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语句。
我们还可以采用另一种方法并使用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
请注意,使用两个撇号"'"来标记引用的文本。
这个怎么样。 @checked是位变量。
SELECT * FROM MyTable (NOLOCK) WHERE col1 = 'ABC' AND (@checked <> 0 and col2 LIKE '%XYZ%')
编辑:另外,如果我们不使用存储的proc,请使用一个。
SELECT * FROM MyTable (NOLOCK) WHERE col1 = 'ABC' AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
这可以在SSRS 2000中使用,但只能作为最后的选择。
(坏)伪代码
="SELECT * FROM MyTable (NOLOCK) WHERE col1 = 'ABC'"+ iff(condition,true,"AND col2 LIKE '%XYZ%'","")
签出执行"动态" SQL查询。摘自《 SQL Server 2000 Reporting Services旅行者指南》
一种方法是通过将SSRS查询生成为表达式。在BIDS报表设计器中,如下设置查询:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" + Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
查尔斯几乎是正确的答案。
它应该是:
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'AND 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。
如果我们可以使用存储过程,则在此操作可能会更容易。传递参数。根据条件创建一个SQL字符串,并对sql字符串执行EXEC,我们存储的proc将返回我们需要的结果。