繁体   English   中英

如果全选被选中,SSRS避免使用WHERE子句

[英]SSRS avoid WHERE clause if select all is selcted

我正在处理SSRS报告,我的SQL查询的一部分就像

WHERE SuperVisorId IN (@SupervisorIDs) AND CreatedDate> @StartDate

其中@SupervisorIDs是带有“全选”选项和单个主管的选项的下拉列表。

因此,如果选择了主管“ all”选项,那么我就不需要在where子句中包含它,而我的where子句仅是这个

  WHERE CreatedDate> @StartDate

那么如何根据选择下拉列表使WHERE子句看起来不同

仅当您使用单个值参数并将手动添加的“ All选项添加到可用值列表时,此选项才适用。 多值参数不知道何时选择所有选项。

SQL Server并不总是按照编写它们的顺序在where子句中执行条件,因此,如果您使用where (@p = 'all' or col = @p) and ...您可能仍在比较值。

如果需要考虑性能,可以使用短路case来避免这种case ,只有在必要时才进行实际数据比较:

where case when @SupervisorIDs = 'All' then 1
           else case when SuperVisorId = @SupervisorIDs then 1
                     else 0
                     end
           end = 1
  and CreatedDate > @StartDate

假设您正在使用数据集查询来填充主管参数下拉列表,则可以尝试此操作。

创建另一个布尔类型的隐藏参数。 对于此示例,我将其称为@AllSupsSelected。 将参数的默认值设置为:= COUNT(Parameters!SupervisorIds.Label)= COUNT(Fields!SupervisorIdLabel.Value,“ SupervisorDataset”)

相应地替换字段和数据集名称。 如果数据集返回的是不同的值,则可能需要进一步修补才能使此工作正常。

现在您的查询可以读取:

WHERE @AllSupsSelected或SupervisorId IN(@SupervisorIds)

使您的where子句如下所示

WHERE (
        (SuperVisorId IN (@SupervisorIDs))
        OR (
            @SupervisorIDs = 0
            AND COLUMN_WITH_NULL IS NOT NULL
            )
        )
    AND CreatedDate > @StartDate

并在选择“全选”时传递0

作为对特定问题的实际答案,请设置多值参数数据集与此类似,以返回所有Supervisors以及列表的底部No Supervisor

select distinct SupervisorID as Value
               ,SupervisorName as Label
               ,1 as Sort
from Suppliers

union all

select <Uniquely identifiable value with the same data type as SupervisorID> as Value
      ,'No Supervisor' as Label
      ,2 as Sort

order by Sort
        ,Label

然后在您的数据集中设置与下面类似的过滤。 我以这种方式构造它,以避免在您的SupervisorID列上使用isnull函数,这会影响查询性能:

select cols
from tables
where SupervisorID in(@SupervisorID)
   or (SupervisorID is null
       and <Unique value from above> in (@SupervisorID)
      )

哪个版本的ssrs? 在2016年,您无需更改查询。 默认情况下,当您单击“全选”时,它将传递所有值。 因此您的查询在不进行任何更改的情况下效果很好。

谢谢,SK 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM