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