代码之家  ›  专栏  ›  技术社区  ›  λ Jonas Gorauskas

SSRS:动态更改SQL语句

  •  5
  • λ Jonas Gorauskas  · 技术社区  · 16 年前

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

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

    8 回复  |  直到 8 年前
        1
  •  15
  •   Brannon    16 年前

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

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

    这是SQL中用于条件谓词的经典“模式”。如果 @checked = 0 ,然后它将返回与谓词其余部分匹配的所有行( col1 = 'ABC' ).SQL Server甚至不会处理 OR .

    如果 @checked = 1 然后,它将评估报告的第二部分 col1 = 'ABC' AND col2 LIKE '%XYZ%'

    例如:

    SELECT * FROM MyTable (NOLOCK) 
    WHERE col1 = 'ABC'
        AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
        AND (@checked2 = 0 OR col3 LIKE '%MNO%')
    

    不要使用动态SQL,不要使用IF或CASE。

        2
  •  3
  •   Charles Graham    16 年前

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

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

    编辑: 另外,如果您没有使用存储过程,那么请使用存储过程。

        3
  •  1
  •   Jason Stevenson    16 年前

    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语句。

        4
  •  1
  •   Leon Tayson    16 年前
    SELECT * FROM MyTable (NOLOCK) 
    WHERE col1 = 'ABC'
    AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
    
        5
  •  1
  •   jason saldo    16 年前

    这将在SSRS 2000中起作用,但用作最后手段。

    (坏)伪代码

    ="SELECT * FROM MyTable (NOLOCK)
    WHERE col1 = 'ABC'"+
    iff(condition,true,"AND col2 LIKE '%XYZ%'","")
    

    退房 Executing "Dynamic" SQL Queries . 从搭便车指南到SQL Server 2000 Reporting Services

        6
  •  1
  •   Ed Harper Ed Harper    16 年前

    ="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
     Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
    
        7
  •  0
  •   ScaleOvenStove    16 年前

    如果您可以使用存储过程,那么在那里可能更容易实现。把你的情妇交上来。根据您的条件创建一个SQL字符串,并对该SQL字符串执行EXEC,存储的过程将返回您需要的结果。

        8
  •  0
  •   NePh Mike Sherrill 'Cat Recall'    8 年前

    您还可以采用另一种方法并使用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  
    

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