【问题标题】:How to make different behavior when 'select all' is selected on a multivalue parameter在多值参数上选择“全选”时如何做出不同的行为
【发布时间】:2019-09-09 11:40:34
【问题描述】:

我有一份报告服务报告和一个 stoproc。该报告有一个多值参数,使用如下:

<QueryParameter Name="@Aannemer">
  <!-- Joins the multivalue selection into a single comma separated string. -->
  <Value>=Join(Parameters!Aannemers.Value,",")</Value>
  <rd:UserDefined>true</rd:UserDefined>
</QueryParameter>

stoproc 使用 string_split 拆分多值参数。 stoproc 很长,所以这里有一个较小的版本:

    @Aannemer AS NVARCHAR(max) = NULL
[...]

    SELECT DISTINCT PV.ProefvakID
    FROM [dbo].[Proefvak] PV
    LEFT OUTER JOIN Meetvak MV ON MV.ProefvakID = PV.ProefvakID
    LEFT OUTER JOIN Uitvoerder UI ON UI.UitvoerderID = MV.UitvoerderID
    WHERE (UI.Uitvoerder IN(select value from string_split(@Aannemer,',')) OR @Aannemer IS NULL )

到目前为止,这一切都像一个魅力。

如果用户为 Aannemer 参数选择“全选”,他希望查看所有 Proefvak 并且根本不过滤 Aannemers。 但是,如果存在未连接 Meetvak 的 Proefvak,则永远不会列出 Proefvak(因为 Meetvak 拥有 Uitvoerder 而 Proefvak 没有 Meetvak)。用户仍然希望看到没有 Meetvak 的 Proefvak。

有没有办法在 stoproc 中检查用户是否选择了“全选”,以便我可以返回所有 Proefvak?

我希望你能理解我想要完成的工作。谈到 SQL,我是个菜鸟,所以请清楚复杂的部分。提前致谢!

==编辑== 尝试使用@EddiGordo 的解决方案,看起来很有希望。下一个问题是@Aannemer 参数不包含值“全选”,因为这不是实际值。所以我尝试像这样编辑SSRS端的代码:

<QueryParameter Name="@Aannemer">
            <!-- Joins the multivalue selection into a single comma separated string. This paramater should be split up in the stored procedure. -->
            <Value>
              =IIF(Parameters!Aannemers.Count = COUNT(1, "Aannemers")
              , "Select All", 
              Join(Parameters!Aannemers.Value,","))
            </Value>
            <rd:UserDefined>true</rd:UserDefined>
          </QueryParameter>

但我无法像这样部署 SSRS 代码,我收到此错误: "用于数据集 '@Aannemer' 中的参数 '@Aannemer' 的表达式包括聚合或查找函数。聚合和查找函数不能用于查询参数表达式。"

【问题讨论】:

    标签: sql sql-server reporting-services


    【解决方案1】:

    试试这个:

    IF @Aannemer IS NULL  
    BEGIN
      SELECT DISTINCT PV.ProefvakID
        FROM [dbo].[Proefvak] PV
        LEFT OUTER JOIN Meetvak MV ON MV.ProefvakID = PV.ProefvakID
        LEFT OUTER JOIN Uitvoerder UI ON UI.UitvoerderID = MV.UitvoerderID
    END
    ELSE
    BEGIN
      SELECT DISTINCT PV.ProefvakID
        FROM [dbo].[Proefvak] PV
        LEFT OUTER JOIN Meetvak MV ON MV.ProefvakID = PV.ProefvakID
        LEFT OUTER JOIN Uitvoerder UI ON UI.UitvoerderID = MV.UitvoerderID
        WHERE UI.Uitvoerder IN(select value from string_split(@Aannemer,','))
    END
    

    【讨论】:

    • 用户要求将“全选”值视为空值。你没有回答问题。
    • @EddiGordo 这正是我的意思。我很高兴你能理解我并把我的意思用一句话表达出来。
    【解决方案2】:

    尝试改变:

    OR @Aannemer IS NULL
    

    通过

    OR nullIf(@Aannemer, 'Select All') Is Null
    

    在你的 IN(Select... 条件的 where 子句中

    【讨论】:

    • 这对我不起作用。当用户选择“全选”时,您确定值“全选”在逗号分隔的字符串中吗?
    • 不,我不知道“全选”的价值是什么。您必须检查它并相应地修改 nullIf 语句。可能是空字符串(“”)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多