【问题标题】:Multi value parameter not working in SSRS report多值参数在 SSRS 报告中不起作用
【发布时间】:2019-01-26 15:46:12
【问题描述】:

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

我是这样设置参数的:

  • 使用查询创建新数据集。

  • 将新参数添加到参数文件夹(名称为 NewParam)。

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

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

=Join(Parameters!NewParam.Value,",") 
  • 在主查询结束时,我过滤结果:
select * 
from @FinalStatusTbl 
where Test_Number in (@NewParam) 
order by Priority

问题是:

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

你知道为什么吗?

(当我尝试这个时:where Test_Number in ('Test 1', 'Test 2') 效果很好)。

【问题讨论】:

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


    【解决方案1】:

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

    将您的=Join(Parameters!NewParam.Value,",") 替换为=Parameters!NewParam.Value,您应该没问题。


    也就是说,您看到人们使用 join 表达式的原因是,如果您的参数有很多潜在的选择并且您的数据相当大,有时您的查询会大大减慢。此处所做的是将join 表达式与数据集中的字符串拆分函数相结合,该函数将生成的Value1,Value2,Value3 字符串值转换为可通过inner join 用于查询的表中。

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

    【讨论】:

    • 谢谢。我猜你的意思是 =Parameters!NewParam.Value 没有 J。我试过了,但我得到了这个错误:An error has occurred during report processing. (rsProcessingAborted) Query execution failed for dataset 'MainQuery'. (rsErrorExecutingCommand) An expression of non-boolean type specified in a context where a condition is expected, near ','. Incorrect syntax near the keyword 'else'.
    • 能否将您的 SQL 和数据集参数属性的屏幕截图添加到问题中?
    • 我添加了数据集参数属性,你需要SQL MainQuery吗?
    • 这些是字段属性。请添加参数属性的屏幕截图。您可以通过单击该窗口左侧的Parameters 来查看此屏幕。
    • 在您的数据集属性窗口中,单击左侧的参数部分。此外,您当前没有在查询中使用 @NewParam 参数。请添加您的报告的相关屏幕截图,但您的问题无法正常工作。
    【解决方案2】:

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

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

    【讨论】:

    • 我不明白..你能给我举个例子吗?
    • 这对报表性能非常不利。应在数据库级别过滤数据。通过在报表中过滤,数据传输以及报表中的数据处理需要额外的时间,这比 SQL Server 慢得多。
    【解决方案3】:

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

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

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

    【讨论】:

    • 你确定吗?我想如果我这样定义参数:=Join(Parameters!NewParam.Value,",") 值不是一个长字符串,是几个字符串。无论如何-我会尝试您的建议并会更新:)
    • 如果您运行USE [ReportServer]; GO SELECT * FROM dbo.ExecutionLog3 ORDER BY TimeStart DESC ;,您应该能够看到正在/正在作为参数传递的值
    • @ShaykiAbramczyk 这正是 join 表达式的作用,也是它在您的数据集中不起作用的原因。
    【解决方案4】:

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

    =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 ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多