我制作了一个SSRS报告,其中包含一个文本字段参数,用户将在其中输入以逗号分隔的字符串值列表。该列表将被输入到报表的数据集中的SQL查询中,该数据集中包含:... WHERE TheField(@myCSVParam)。
如果我从字段传入单个值,它可以工作,但是如果我从字段中传递csv列表,那么报告会说这样的值不存在。
我认为它将csv列表视为单个值,因此没有数据返回。
如何转换该csv列表并转换为sql IN过滤器的可用参数?
答案 0 :(得分:2)
我今天正在寻找一种方法来做到这一点,并且有很多建议需要构建一个存储过程来处理这个,但我发现这个解决方案有点混乱。我终于找到了自己的,非常简单的解决方案。
因此,假设您希望用户能够在单个文本框中输入多个销售订单,以逗号分隔,例如:61JF073, 61SW073, 61SW074
我的第一个报告参数名为“OrderNo”,描述“订单号(用逗号分隔)”。数据类型=“文本”,没有选中任何内容。
我的第二个参数将从第一个参数中获取列表,并创建一个“多值”列表,您可以在SQL查询中使用该列表。
第二个参数:Name =“OrderNos”,type =“Text”。选中“允许多个值”。参数visibility =“Internal”(用户不需要看到这个)。
可用值=无
默认值=指定值
添加值:
=Split(Replace(Parameters!OrderNo.Value," ",""),",")
我使用“替换”功能删除所有空格,因为用户可能会在逗号后面输入空格,这会影响输出。
现在,您的SQL查询可以包含“IN”子句来过滤结果。
SELECT OrderNo, SalesID, SalesName
FROM SalesOrders
WHERE OrderNo IN (@OrderNos)
数据将在SQL服务器而不是SSRS报告中进行过滤,SSRS报告是在应用过滤器之前保存SSRS报告以检索整个表的首选方法。您只想检索报告所需的数据。
我希望这会对我有所帮助,因为我的销售订单表有数千行。
答案 1 :(得分:1)
而不是2个参数,我使用了类似= split( 参数!Category.Value ,“,”)
并将SQL [In(@Category)]中使用的参数设置为该表达式。 唯一的缺点是它隐藏在数据集参数选项卡中。
我最终将它更改为= split(替换(参数!Category.Value,“”,“”),“,”)和你的一样:)如果您想要一个参数并且参数相等,那么由您决定表达式,或有2个参数,并将1传递给另一个。
我无法发布图片,但我的http://i.stack.imgur.com/rhnWt.png
答案 2 :(得分:0)
听起来@myCSVParam
是单值字符串参数。因此,SSRS将在SQL语句中使用它时引用它。因此,对于一个值,您将获得'First'
(这是一个匹配项),但对于多个值,您将获得'First, Second, Third'
(即一个与任何内容不匹配的大值),而不是{{1} (即,三个单独值的列表),这就是你所追求的。
您有两种选择:
通过用引号替换逗号来手动创建列表,如下所示:
=替换(参数!myCSVParam.Value,“,”,“','”)
答案 3 :(得分:0)
您可以尝试以下查询:
WHERE TheField in(SELECT regexp_substr(@myCSVParamt,'[^,] +',1,level)A FROM DUAL CONNECT BY regexp_substr(@myCSVParam,'[^,] +',1,level)不为null)
希望有所帮助!