SSRS多值参数不起作用

时间:2018-08-20 13:38:24

标签: sql-server reporting-services tfs ssrs-2012

我有SSRS报告。主查询上有一个长SQL查询,在最后一个SELECT中,我想使用WHERE表达式来过滤结果,过滤器应该使用多值参数。

我以这种方式设置参数:

  • 使用查询创建新的数据集。 enter image description here enter image description here

  • 将新参数添加到Parameters文件夹(名称为NewParam)。 enter image description here enter image description here

  • 选中“允许多个值”复选框。

  • 将参数添加到“主查询”并使用以下表达式设置值:

    =Join(Parameters!NewParam.Value,",")

  • 在主查询的最后,我过滤结果:

    select * from @FinalStatusTbl where Test_Number in (@NewParam) order by Priority

enter image description here enter image description here

问题是:

在报告中,当我从列表中选择一个值时,我得到了预期的结果,但是如果选择多个值,则结果为空(没有错误)。

你知道为什么吗?

(当我尝试使用此方法时:where Test_Number in ('Test 1', 'Test 2')效果很好)。

4 个答案:

答案 0 :(得分:1)

使用sql查询创建数据集时,多值参数可以与in(@ParamName)一起使用,而无需进行任何更改。

仅将=Join(Parameters!NewParam.Value,",")替换为=Parameters!NewParam.Value,就可以了。


也就是说,您之所以看到人们使用join表达式,是因为有时如果您的参数有很多潜在选择并且您的数据相当大,则查询速度会大大降低。此处要做的是将join表达式与数据集中的字符串拆分功能结合在一起,该函数将结果Value1,Value2,Value3的字符串值转换为可通过inner join在查询中使用的表中。

如果将多个值作为参数传递给存储过程,这也是一个要求,因为您不能使用in(@ParamName)语法。

答案 1 :(得分:0)

您可以尝试从where子句中删除参数,并在数据集属性的过滤器部分中使用该参数。

这将有效地将过滤从SQL转移到SSRS。

答案 2 :(得分:0)

您需要做的是在数据库中拆分字符串。传递给您的查询的是作为完整字符串的“测试1,测试2”,而不是“测试1”和“测试2”。这就是为什么单个值有效而多个值无效的原因。

Here是有关如何拆分字符串的一个很好的链接,以为您的场景做准备。我最常使用的功能是CTE示例,该示例返回一个拆分字符串表。然后,我将SQL查询更改为在返回的表上使用IN

在您的示例中,您将要编写WHERE Test_Number IN (SELECT Item FROM dbo.ufn_SplitStrings(@NewParam),其中ufn_SplitString是您从前面提到的链接创建的函数。

答案 3 :(得分:0)

这就是我所做的,对我来说效果很好。您也可以尝试。

=sum(if(Fields!Business_Code.Value = "PH" 
and (Fields!Vendor_Code.Value = "5563"
and Fields!Vendor_Code.Value = "5564"
and Fields!Vendor_Code.Value = "5565"
and Fields!Vendor_Code.Value = "5551")
, Fields!TDY_Ordered_Value.Value , nothing ))

enter image description here