如果选择all all,则SSRS避免使用WHERE子句

时间:2017-03-09 09:50:46

标签: sql-server reporting-services ssrs-2012

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

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

其中@SupervisorIDs是一个下拉列表,可选择“全选”和各个主管。

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

  WHERE CreatedDate> @StartDate

那么如何根据选择下拉列表

使WHERE子句看起来不同

5 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

假设您正在使用数据集查询来填充supervisor参数下拉列表,那么您可以尝试这样做。

创建一个布尔类型的附加隐藏参数。对于这个例子,我将它称为@AllSupsSelected。将参数的默认值设置为: = COUNT(参数!SupervisorIds.Label)= COUNT(字段!SupervisorIdLabel.Value, “SupervisorDataset”)

相应地替换字段和数据集名称。如果数据集返回非不同的值,您可能需要进一步修改以使其正常工作。

现在您的查询可以阅读:

WHERE @AllSupsSelected或SupervisorId IN(@SupervisorIds)

答案 2 :(得分:0)

制作你的where子句如下

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

选中时传递0"选择全部"

答案 3 :(得分: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 列表底部的值:< / p>

isnull

然后在您的数据集中设置类似于下面的过滤。我已经以这种方式构建它,以避免在SupervisorID列上使用select cols from tables where SupervisorID in(@SupervisorID) or (SupervisorID is null and <Unique value from above> in (@SupervisorID) ) 函数,这会损害查询性能:

.test

答案 4 :(得分:-1)

哪个版本的ssrs?在2016年,您无需更改查询。当您单击“全选”时,默认情况下会传递所有值。所以你的查询在不改变任何东西的情

感谢, SK enter image description here