我在SSRS 2005中有一个基于与此类似的查询的报告:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'
我需要能够根据用户是否选中了复选框,在查询中动态包含WHERE子句的AND部分。基本上,这是一个动态SQL语句,这就是问题所在。我试过几种方法都无济于事。这可能吗? SSRS 2005是否支持动态SQL?谢谢!
答案 0 :(得分:14)
查尔斯几乎得到了正确的答案。
应该是:
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。
答案 1 :(得分:3)
这个怎么样? @checked是你的位变量。
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')
编辑另外,如果您没有使用存储过程,请使用存储过程。
答案 2 :(得分:1)
也许这对你有用:
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语句。
答案 3 :(得分:1)
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
答案 4 :(得分:1)
这适用于SSRS 2000,但作为最后的手段使用。
(差)PSEUDOCODE
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")
结帐Executing "Dynamic" SQL Queries。来自Hitchhiker的SQL Server 2000 Reporting Services指南
答案 5 :(得分:1)
执行此操作的一种方法是将SSRS查询生成为表达式。在BIDS报表设计器中,将查询设置为:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
答案 6 :(得分:0)
您还可以采用其他方法并使用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
请注意使用两个撇号'
来标记引用的文字。
答案 7 :(得分:0)
如果你可以使用存储过程,那么它可能更容易实现。传递你的参数。根据您的条件创建一个SQL String并对sql字符串执行EXEC,您的存储过程将返回您需要的结果。