SSRS:动态更改SQL语句

时间:2020-03-06 14:45:57  来源:igfitidea点击:

我在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将返回我们需要的结果。