我在 SSRS 2005 中有一份基于与此类似的查询的报告:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'
我需要能够根据用户是否选中复选框,在查询中动态包含 WHERE 子句的 AND 部分。基本上,这是一个动态 SQL 语句,这就是问题所在。我尝试了几种方法都无济于事。这可能吗?SSRS 2005 是否支持动态 SQL?谢谢!
我在 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。
这个怎么样。@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 中工作,但用作最后的手段。
(坏)伪代码
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")
查看执行“动态”SQL 查询。从 Hitchhiker's Guide to SQL Server 2000 Reporting Services
一种方法是将 SSRS 查询生成为表达式。在 BIDS 报表设计器中,像这样设置您的查询:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
您还可以采取另一种方法并使用 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
请注意使用两个撇号'
来标记引用的文本。
如果您可以使用存储过程,那么在那里执行它可能更容易。传入你的参数。根据您的条件创建一个 SQL 字符串并对 sql 字符串执行 EXEC,您的存储过程将返回您需要的结果。