我的报告有一个多值参数。它有可用的值(1,2,3,4,5和空白)。空白值不是NULL,它只是一个空单元格。
出于测试目的,应该只显示一条记录。该记录在我用于在我的存储过程中过滤的单元格中有一个空白值。
在参数下拉列表中,我看到了所有选项。如果我选择(全选)选项,我不会得到我想要的记录。但是,如果我只选择空白值,我会得到我想要的记录。我手动将记录更新为“2”。我选择(全选)并获得记录。我只选择“2”值并得到记录。如果我再次删除该值以使值为空,我只会在下拉列表中选择“空白”选项时获取记录。
我创建了一个文本框来输出参数的值,当它被自己或其他值选中时,它显示为空白。
我的存储过程或报告中缺少什么?提前谢谢。
答案 0 :(得分:1)
如果您有多个select参数,SSRS应该以逗号分隔的值列表发送到您的存储过程。您有责任将这些内容拆分为可以加入的内容。
在报告本身中,您没有在一个包装精美的字符串中获取值列表以供显示。我不得不使用代码来迭代参数中的值。
当我有空白可用值时,我测试了SSRS正在做什么。我创建了一个测试报告,其中包含六个可用选项,然后是一个存储过程,用于强制输出所选值:
CREATE PROCEDURE dbo.Test_RPT
(
@TestMultiSelect varchar(1000)
)
AS
SELECT @TestMultiSelect RVAL
在报告中,我只有一个显示此RVAL
字段的文本框。
如果我在开头放置空白选项,则输出为1,2,3,4,5
。如果空白选项位于任何其他位置,则其中包含:1,2,3,,4,5
,1,2,3,4,5,
。
答案 1 :(得分:0)
如果要在SSRS报告数据集的存储过程中将多个值传递给Sql IN子句,则存储过程中需要进行细微更改:
请参阅SP
中的Sample 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,','))