在SSRS 2005中,是否可以在非查询的可用值中为ONE标签设置多个值?

时间:2014-01-08 22:57:21

标签: reporting-services parameters

参数 - 一个标签的多个值 - 可能吗?

在非查询参数值中,是否可以在一行中为一个标签设置多个值, 这样我就可以在下拉列表中为多个值设置一个LABEL。

基本上,如果我为每个标签写单个值,那么它工作正常,但问题是当我运行报告时它会显示每个名称的复选框。用户勾选并选择Site-1的所有值(如九或十个值)看起来不太好。理想情况下,它应该是一个标签和多个值(我想要的)。

工作正常:(但是这会在下拉菜单中显示一个很长的列表,因为我对site-1有更多的价值,我不想要这样做)

Label                Value
---------------------------
Site-1                 150
Site-1                 151
Site-1                 152
Site-1                 160 
Site-2                 161
Site-2                 162

并且在查询ColumnName IN (@Site)中也可以正常工作。

必填结果(在一行中,以便下拉菜单只能提供两个标签)

Label                Value
---------------------------
Site-1                 150,151,152,160
Site-2                 161,162

会在下拉列表或组合框中显示一个标签和相关的多值,而在查询ColumnName IN (@Site)中则无效。

对不起。站点是DB中的列名称,@ Site是变量名称。

Site-1& Site-2是下拉菜单的标签名称。

1 个答案:

答案 0 :(得分:0)

基本问题是,当您将逗号分隔的值作为参数传递时,数据库会将逗号分隔值视为普通字符串,因此当它期望int时,它不知道如何处理'150,151,152,160'

处理此问题的一般方法是创建一个表值函数,在传入逗号分隔的字符串时返回一个表。我找到的最简单的方法是Erland Sommarskog's Arrays and Lists in SQL Server

CREATE FUNCTION split_csv (@list nvarchar(MAX))
   RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
   RETURN
END

然后使用上面的函数,查询中的那一行变为:

ColumnName IN (SELECT number FROM split_csv(@Site))

如果您使用的是SQL Server 2008+,则可以使用表值参数,这样更简单。我将推荐您使用相同的Erland Sommarskog site来获取相关信息。