【问题标题】:SSRS Records Not Showing Up When (Select All) Is Used But Is When Selecting A Particular ValueSSRS 记录在使用(全选)时不显示,但在选择特定值时显示
【发布时间】:2015-10-20 16:32:14
【问题描述】:

我有一个具有多值参数的报告。它具有可用值(1、2、3、4、5 和空白)。空白值不是 NULL 它只是一个空单元格。

出于测试目的,应该只显示一条记录。该记录在我用于在存储过程中过滤的单元格中有一个空白值。

在参数下拉列表中,我看到了所有选项。如果我选择(全选)选项,我不会得到我想要的记录。但是,如果我只选择空白值,我会得到我想要的记录。我手动将记录更新为“2”。我选择(全选)并获得记录。我只选择“2”值并获得记录。如果我再次删除该值以使该值变为空白,则只有在下拉菜单中选择“空白”选项时才能获得记录。

我制作了一个文本框来输出参数的值,当它被单独选择或与其他值一起选择时显示为空白。

我的存储过程或报告中缺少什么?提前致谢。

【问题讨论】:

    标签: sql-server reporting-services ssms ssrs-2012 sql-server-data-tools


    【解决方案1】:

    当您有一个多选参数时,SSRS 应该向您的存储过程发送一个逗号分隔的值列表。你有责任将这些拆分成你可以加入的东西。

    在报告本身中,您不会以包装精美的字符串形式获取值列表以进行显示。我不得不使用代码来迭代参数中的值。

    当您有一个空白可用值时,我测试了 SSRS 正在做什么。我创建了一个包含六个可用选项的测试报告,然后是一个存储过程来强制输出所选值:

    CREATE PROCEDURE dbo.Test_RPT
    (
     @TestMultiSelect varchar(1000)
    )
    AS
    SELECT @TestMultiSelect RVAL
    

    在报告中,我只有一个显示 RVAL 字段的文本框。

    如果我将空白选项放在开头,则输出为1,2,3,4,5。如果空白选项位于任何其他位置,则包括:1,2,3,,4,51,2,3,4,5,

    【讨论】:

    • 我有一个功能可以做到这一点。这就是我能够使用其他值的方式。
    • SQL中有这个函数吗?或者,您是在谈论添加到报告中的功能吗?
    • SQL 中的自定义函数。我之前在许多报告中使用它来辅助多个值参数。
    • 您是否测试过 SSRS 向空白存储过程发送了什么?尝试将参数值写入 db 表,这样您就可以看到真正发送的内容。空白可能是一个没有长度的字符串。如,传递的值可能是 ',1,2,3,4,5'。您的表格是否需要一个空格字符?
    • 没有长度的字符串是正在发生的事情,也是我希望在报告中找到的内容。如果我只选择空白值,但如果我选择该空白值和另一个值的任何其他组合,记录就会出现。
    【解决方案2】:

    如果您想从 SSRS 报告数据集中将多个值传递给存储过程中的 Sql IN 子句,则需要在存储过程中稍作更改:

    查看 SP 中的示例 WHERE 子句

    ...  
    AND Courses.Type_Code IN (@Type_Code)
    

    添加一个SplitString()函数,根据分隔符对传入的参数进行拆分。

    SplitString() 的主体将如下所示:

    CREATE FUNCTION [dbo].[SplitString]
    (
        @pString VARCHAR(8000), 
        @pDelimiter CHAR(1)
    )
    RETURNS @Values TABLE (Value VARCHAR(50))
    AS
    BEGIN
    
            DECLARE @xml as XML;
    
            SET @xml = cast(('<X>'+replace(@pString, @pDelimiter, '</X><X>')+'</X>') as xml);
    
            INSERT @Values
            SELECT N.value('.', 'varchar(50)') as value 
            FROM @xml.nodes('X') as T(N);
    
            RETURN
    END;
    

    最后,IN 子句将如下所示:

    ...
    AND Courses.Type_Code IN (SELECT * FROM dbo.SplitString(@type_code,','))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2013-04-08
      • 1970-01-01
      • 2015-03-11
      • 2019-12-12
      • 2019-05-23
      • 1970-01-01
      相关资源
      最近更新 更多