5

我在 SSRS 2005 中有一份基于与此类似的查询的报告:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'

我需要能够根据用户是否选中复选框,在查询中动态包含 WHERE 子句的 AND 部分。基本上,这是一个动态 SQL 语句,这就是问题所在。我尝试了几种方法都无济于事。这可能吗?SSRS 2005 是否支持动态 SQL?谢谢!

4

8 回答 8

15

查尔斯几乎得到了正确的答案。

它应该是:

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。

于 2008-09-26T07:46:50.383 回答
3

这个怎么样。@checked 是您的位变量。

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')

编辑: 另外,如果您不使用存储过程,请使用一个。

于 2008-09-26T05:35:00.997 回答
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 语句。

于 2008-09-26T05:00:54.900 回答
1
SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
于 2008-09-26T05:56:52.143 回答
1

这将在 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

于 2008-09-26T06:12:55.943 回答
1

一种方法是将 SSRS 查询生成为表达式。在 BIDS 报表设计器中,像这样设置您的查询:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
于 2008-09-26T07:38:20.043 回答
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  

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

于 2008-09-26T05:29:59.370 回答
0

如果您可以使用存储过程,那么在那里执行它可能更容易。传入你的参数。根据您的条件创建一个 SQL 字符串并对 sql 字符串执行 EXEC,您的存储过程将返回您需要的结果。

于 2008-09-26T16:35:40.617 回答