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