我有SSRS报告。主查询上有一个长SQL查询,在最后一个SELECT
中,我想使用WHERE
表达式来过滤结果,过滤器应该使用多值参数。
我以这种方式设置参数:
选中“允许多个值”复选框。
将参数添加到“主查询”并使用以下表达式设置值:
=Join(Parameters!NewParam.Value,",")
在主查询的最后,我过滤结果:
select *
from @FinalStatusTbl
where Test_Number in (@NewParam)
order by Priority
问题是:
在报告中,当我从列表中选择一个值时,我得到了预期的结果,但是如果选择多个值,则结果为空(没有错误)。
你知道为什么吗?
(当我尝试使用此方法时:where Test_Number in ('Test 1', 'Test 2')
效果很好)。
答案 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 ))