我在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  

请注意使用两个撇号'来标记引用的文字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top