Sql server 如果选择了select all,则SSRS避免WHERE子句

Sql server 如果选择了select all,则SSRS避免WHERE子句,sql-server,reporting-services,ssrs-2012,Sql Server,Reporting Services,Ssrs 2012,我正在处理一个SSRS报告,我的sql查询的一部分如下 WHERE SuperVisorId IN (@SupervisorIDs) AND CreatedDate> @StartDate 其中,@SupervisorIDs是一个下拉列表,可选择“选择所有和单个主管” 因此,如果选择了supervisors all选项,则我不需要将其包含在where子句中,而我的where子句仅包含此选项 WHERE CreatedDate> @StartDate 那么,如何根据下拉列表的选

我正在处理一个SSRS报告,我的sql查询的一部分如下

WHERE SuperVisorId IN (@SupervisorIDs) AND CreatedDate> @StartDate
其中,@SupervisorIDs是一个下拉列表,可选择“选择所有和单个主管”

因此,如果选择了supervisors all选项,则我不需要将其包含在where子句中,而我的where子句仅包含此选项

  WHERE CreatedDate> @StartDate

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

WHERE (
        (SuperVisorId IN (@SupervisorIDs))
        OR (
            @SupervisorIDs = 0
            AND COLUMN_WITH_NULL IS NOT NULL
            )
        )
    AND CreatedDate > @StartDate
选择“全选”(select all)

时传递0这仅适用于使用单值参数并在可用值列表中手动添加“全选”(all)选项的情况。多值参数不知道何时选择了所有选项。 SQL Server并不总是按照您写入where子句的顺序来执行这些条件,因此如果您使用where@p='all'或col=@p和。。。您可能仍在比较您的值

如果性能是一个问题,您可以通过使用短路情况来避免这种情况,只有在必要时才进行实际数据比较:

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

作为特定问题的实际答案,将多值参数数据集设置为与此类似的方式,以返回所有监控器以及列表底部无监控器的值:


哪个版本的ssrs?在2016年,您不需要更改查询。默认情况下,单击“全选”时,它会传递所有值。因此,您的查询在不改变任何内容的情况下运行良好

谢谢,
SK

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

创建布尔类型的其他隐藏参数。对于本例,我将其命名为@AllSupsSelected。将参数的默认值设置为: =COUNTParameters!SupervisorIds.Label=COUNTFields!SupervisorLabel.Value,SupervisorDataset

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

现在,您的查询可以读取:


如果@superselected或SupervisorId在@SupervisorIds中,那么@SupervisorIds='All'或SupervisorId在@SupervisorIds和CreatedDate>@StartDate中的位置如何,假设在multiselect下拉菜单中选择SSRS中的所有选项时,您实际为参数设置了All。但是,当我们选择特定的supervisor值时会发生什么情况,此时它将返回所有行和所选行,我想这是错误的。问题的目的是了解基于下拉选择使用条件where子句的可能性,因为db中有一些行的值为NULL,如果我选择“全选”选项,我也必须处理NULL值,如果选择了特定的“主管”,我必须跳过NULL值。参数是单值还是多值参数?它是多值参数,但如何将0传递给ssrs下拉列表以进行全部选择。这个问题的目的是检查是否有可能根据下拉检查的输入编写条件查询,如果选择全部,则将响应更改为0true@JibinMathew,您必须为SupervisorID传递任何值。除了此处讨论的内容外,您还需要检查筛选器,SSRS中的formua选项。我不记得确切的术语。@KumarHarsh这很有希望。但是,我们可以将其作为数据集SQL查询的一部分吗?您的SSR中是否定义了hv参数?您在这些参数中传递了什么以及您如何使用它?但是,我们可以将选择限制为默认情况下仅在Begging中的“all”吗?或将在选择的同时显示“全部选择”我收到此错误执行查询时出错。在需要条件的上下文中指定的非布尔类型的表达式,靠近“或”。语法不正确,靠近“我的查询”类似于登录会话,其中CreatedDate>“@”BeginDate和CreatedDate<“@”EndDate和“@”SupervisoridSorry中的“@”AllSelected或SupervisorId,我在手机上回答/评论,没有多少机会测试。您可能需要尝试@AllSelected=True或@AllSelected=True。我有一个错误:报表参数“AllPeopleSelected”使用的值表达式引用了一个字段。不能在报表参数表达式中使用字段。OP想知道如果选择了所有选项,如何包含未传递的值。我认为这个答案不正确。
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
select cols
from tables
where SupervisorID in(@SupervisorID)
   or (SupervisorID is null
       and <Unique value from above> in (@SupervisorID)
      )