我有一份 SSRS 报告,其中有 3 个数据集来自一个数据源。主数据集是一个存储过程,它根据由其他两个数据集提供支持的一组参数聚合一些数据。
支持此报告的主要存储过程有 4 个参数。一个是数据类型的 ID,两个是开始和结束日期,第三个只是一个标志参数。flag 参数是多值参数,我想在其中传递多个也是 VARCHAR 值的标志值。
在我的 @Flag 参数的存储过程中,我有共同点:
WHERE [Flag] IN (@Flag)
Run Code Online (Sandbox Code Playgroud)
然后当然 SSRS 报告上的 @Flag 参数设置为允许“多个值”,这些值也是从从维度表中提取这些 @Flag 值的查询填充的。
我的问题
在大多数情况下,在处理 INT 值时,使用相同的技术是有效的。但是,当我处理字符值时,它失败了。如果我选择一个标志,报告会神奇地工作。如果我选择了多个标志,它似乎不会将这些标志正确地传递给存储过程,并且不会返回任何结果。
直接在存储过程中测试多值标志时:
WHERE [Flag] IN ('A', 'B', 'C')
Run Code Online (Sandbox Code Playgroud)
存储过程正常工作。所以问题不在于存储过程,而在于 SSRS 如何将多值值传递给 @Flag 参数。
尝试的解决方案
我尝试对这个@Flag 参数的 SSRS 数据集进行以下调整:
=join(Parameters!<your param name>.Value,",")
Run Code Online (Sandbox Code Playgroud)
还有这个:
=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")
Run Code Online (Sandbox Code Playgroud)
这些都适用于单个值,但从不适用于多值。
我在这里缺少什么?
我找到了解决方案。我没有使用 UDF 正确拆分存储过程中的值。
要在此存储过程中正确传递多值,我需要将以下代码添加到我正在使用的数据集参数中:
=join(Parameters!<your param name>.Value,",")
Run Code Online (Sandbox Code Playgroud)
这基本上是将多个值连接到一个数组中并通过@Flag
参数传递它。下一步是将 SQL 添加到存储过程以正确接收和消化值,以便它使用IN
子句读取值。
谷歌在线搜索任何 UDF 字符串解析器。有很多可供选择。我dba_parseString_udf
从 Michelle Ufford http://sqlfool.com 使用。
安装 UDF 后,我现在可以更改IN
子句以接收 SSRS 传递的新多值参数,如下所示:
WHERE [Flag] IN (SELECT * FROM dba_parseString_udf(@Flag, ','))
Run Code Online (Sandbox Code Playgroud)
因此,SSRS 将传递以下值:
@Flag = 'A,B,C'
Run Code Online (Sandbox Code Playgroud)
然后我的 UDF 会将该字符串正确解析为:
A
B
C
Run Code Online (Sandbox Code Playgroud)
并@Flag
正确填充我的参数SELECT * FROM UDF()...
归档时间: |
|
查看次数: |
36219 次 |
最近记录: |