2

我制作了一个 SSRS 报告,其中包含一个文本字段参数,用户将在其中输入一个逗号分隔的字符串值列表。该列表将被输入到报表数据集中的 SQL 查询中,该查询具有:...WHERE TheField in (@myCSVParam)。

如果我从该字段中传递一个值,它会起作用,但如果我从该字段中传递一个 csv 列表,那么报告会说这样的值不存在。

我认为它将 csv 列表视为单个值,因此没有数据返回。

如何转换该 csv 列表并转换为 sql IN 过滤器的可用参数?

4

4 回答 4

2

我今天正在寻找一种方法来做到这一点,并且有很多建议需要构建一个存储过程来处理这个问题,但我发现这个解决方案有点混乱。我终于想出了自己的,非常简单的解决方案。

因此,假设您希望用户能够在单个文本框中输入多个销售订单,用逗号分隔,例如:61JF073, 61SW073, 61SW074

我的第一个报告参数名为“OrderNo”,描述为“Order Nos(以逗号分隔)”。数据类型=“文本”,什么都不检查。

我的第二个参数将从第一个参数中获取列表并制作一个“多值”列表,您可以在 SQL 查询中使用该列表。

第二个参数:Name = "OrderNos",type = "Text"。选中“允许多个值”。参数可见性=“内部”(用户不需要看到这个)。可用值 = 无 默认值 = 指定值 添加以下值: =Split(Replace(Parameters!OrderNo.Value," ",""),",")

我正在使用“替换”功能来删除所有空格,因为用户可能会在逗号后输入空格,这会影响输出。

现在您的 SQL 查询可以包含您的“IN”子句来过滤结果。

SELECT OrderNo, SalesID, SalesName FROM SalesOrders WHERE OrderNo IN (@OrderNos)

数据将在 SQL 服务器而不是 SSRS 报告中进行过滤,这是在应用过滤器之前保存 SSRS 报告以防止检索整个表的首选方法。您只想检索报告所需的数据。

我希望这会有所帮助,因为它是我的救星,因为我的销售订单表有数千行。

于 2014-01-14T15:36:00.343 回答
2

而不是 2 个参数,我使用了 =split( Parameters!Category.Value ,",")

并将 SQL [In (@Category) ] 中使用的参数设置为该表达式。唯一的缺点是它隐藏在数据集参数选项卡中。

我最终将其更改为 =split(replace(Parameters!Category.Value," ",""),",") 就像你的一样 :) 取决于你,如果你愿意有 1 个参数并且参数等于一个表达式,或有 2 个参数,并通过另一个传递 1。

我不能发布图片,但我的在这里http://i.stack.imgur.com/rhnWt.png

于 2014-04-23T00:41:43.360 回答
0

您可以尝试以下查询:

WHERE TheField in (SELECT regexp_substr(@myCSVParamt,'[^,]+', 1, level) A FROM DUAL CONNECT BY regexp_substr(@myCSVParam, '[^,]+', 1, level) 不为空)

希望对您有所帮助!

于 2015-01-09T10:53:26.783 回答
0

听起来像是@myCSVParam一个单值字符串参数。因此,SSRS 在 SQL 语句中使用它时会在其周围加上引号。因此,对于您获得的一个值'First'(这是一个匹配项),但对于您获得的多个值'First, Second, Third'(即一个不匹配任何内容的大值)而不是'First', 'Second', 'Third'(即三个单独值的列表),这就是你在追求。

你有两个选择:

  • 使用多值参数,它自然会做你想做的事。如果用户可以从列表中选择值,这是最好的选择
  • 通过用带引号的逗号替换逗号来手动创建列表,如下所示:

    =替换(参数!myCSVParam.Value,“,”,“','”)

于 2013-06-22T05:15:31.957 回答