多值参数在 SSRS 报告中不起作用
Multi value parameter not working in SSRS report
我有一份 SSRS 报告。在主查询上有一个很长的 SQL 查询,在最后一个 SELECT
我想用 WHERE
表达式过滤结果,过滤器应该带有多值参数。
我是这样设置参数的:
- 使用查询创建新数据集。
- 将新参数添加到 Parameters 文件夹(名称为 NewParam)。
选中 "Allow multiple values" 复选框。
将参数添加到 "Main Query" 并使用此表达式设置值:
=Join(Parameters!NewParam.Value,",")
- 在主查询结束时,我过滤了结果:
select *
from @FinalStatusTbl
where Test_Number in (@NewParam)
order by Priority
问题是:
在报告中,当我从列表中选择一个值时,我得到了预期的结果,但如果我选择多个值,则结果为空(没有出现错误。)
你知道为什么吗?
(当我尝试这样做时:where Test_Number in ('Test 1', 'Test 2')
效果很好)。
当您使用 sql 查询创建数据集时,多值参数与 in(@ParamName)
一起使用,无需任何更改。
将您的 =Join(Parameters!NewParam.Value,",")
替换为 =Parameters!NewParam.Value
,您应该没问题。
就是说,您看到人们使用 join
表达式的原因是,如果您的参数有很多潜在选择并且您的数据相当大,有时您的查询速度会大大降低。这里所做的是将 join
表达式与数据集中的字符串拆分函数相结合,将结果 Value1,Value2,Value3
字符串值转换为 table ,可以在查询中使用 inner join
.
如果将多个值作为参数传递给存储过程,这也是一项要求,因为您不能使用 in(@ParamName)
语法。
您可以尝试从 where 子句中取出参数,并在数据集属性的过滤器部分使用该参数。
这将有效地将过滤从 SQL 转移到 SSRS。
您需要做的是在数据库中拆分您的字符串。传递给您的查询的是作为完整字符串的 'Test 1, Test 2',而不是 'Test 1' 和 'Test 2'。这就是为什么单个值有效而多个值无效的原因。
Here 是关于如何拆分字符串的非常好的 link,为您的场景做准备。我最常使用的函数是 CTE 示例,其中 returns a table 我的拆分字符串。然后我将 SQL 查询更改为在返回的 table.
上使用 IN
在您的示例中,您需要编写 WHERE Test_Number IN (SELECT Item FROM dbo.ufn_SplitStrings(@NewParam)
,其中 ufn_SplitString 是您根据前面提到的 link 创建的函数。
这就是我所做的,对我来说效果很好。你也可以试试
=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 ))
我有一份 SSRS 报告。在主查询上有一个很长的 SQL 查询,在最后一个 SELECT
我想用 WHERE
表达式过滤结果,过滤器应该带有多值参数。
我是这样设置参数的:
- 使用查询创建新数据集。
- 将新参数添加到 Parameters 文件夹(名称为 NewParam)。
选中 "Allow multiple values" 复选框。
将参数添加到 "Main Query" 并使用此表达式设置值:
=Join(Parameters!NewParam.Value,",")
- 在主查询结束时,我过滤了结果:
select *
from @FinalStatusTbl
where Test_Number in (@NewParam)
order by Priority
问题是:
在报告中,当我从列表中选择一个值时,我得到了预期的结果,但如果我选择多个值,则结果为空(没有出现错误。)
你知道为什么吗?
(当我尝试这样做时:where Test_Number in ('Test 1', 'Test 2')
效果很好)。
当您使用 sql 查询创建数据集时,多值参数与 in(@ParamName)
一起使用,无需任何更改。
将您的 =Join(Parameters!NewParam.Value,",")
替换为 =Parameters!NewParam.Value
,您应该没问题。
就是说,您看到人们使用 join
表达式的原因是,如果您的参数有很多潜在选择并且您的数据相当大,有时您的查询速度会大大降低。这里所做的是将 join
表达式与数据集中的字符串拆分函数相结合,将结果 Value1,Value2,Value3
字符串值转换为 table ,可以在查询中使用 inner join
.
如果将多个值作为参数传递给存储过程,这也是一项要求,因为您不能使用 in(@ParamName)
语法。
您可以尝试从 where 子句中取出参数,并在数据集属性的过滤器部分使用该参数。
这将有效地将过滤从 SQL 转移到 SSRS。
您需要做的是在数据库中拆分您的字符串。传递给您的查询的是作为完整字符串的 'Test 1, Test 2',而不是 'Test 1' 和 'Test 2'。这就是为什么单个值有效而多个值无效的原因。
Here 是关于如何拆分字符串的非常好的 link,为您的场景做准备。我最常使用的函数是 CTE 示例,其中 returns a table 我的拆分字符串。然后我将 SQL 查询更改为在返回的 table.
上使用IN
在您的示例中,您需要编写 WHERE Test_Number IN (SELECT Item FROM dbo.ufn_SplitStrings(@NewParam)
,其中 ufn_SplitString 是您根据前面提到的 link 创建的函数。
这就是我所做的,对我来说效果很好。你也可以试试
=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 ))