当前位置:  开发笔记 > 编程语言 > 正文

在Reporting Services中为单个参数传递多个值

如何解决《在ReportingServices中为单个参数传递多个值》经验,为你挑选了5个好方法。

我的报告中有几个Multi-Select参数.我试图找到一种方法来传递Web查询字符串中的单个参数的多个值?如果我传入单个值,它可以正常工作.

报告运行良好,为单个参数选择多个选项.我的麻烦在于Web查询字符串.



1> Ed Harper..:

尽管John Sansom的解决方案有效,但还有另一种方法可以做到这一点,而不必使用可能效率低下的标量值UDF.在SSRS报告中,在查询定义的参数选项卡上,将参数值设置为

=join(Parameters!.Value,",")

在您的查询中,您可以像这样引用值:

where yourColumn in (@)


我想在SSRS 2008R2中添加它,不需要使用`JOIN`.您可以将参数值设置为`Parameters! .Value`
@VenkateswarluAvula - 你有一个不同的问题; SQL Server不支持以这种方式将多个值传递给`IN`子句.关于这个主题有几百个问题 - 请参阅http://stackoverflow.com/search?q=sql+server+split+string&submit=search
这种方法不会按预期工作.如果将参数传递给Customer为"Steve,Dave,Bill"的存储过程,那么这将与Customer为"Steve"或"Dave"或"Bill"的行不匹配.它只会匹配客户正好是"Steve,Dave,Bill"的行.

2> 小智..:

这是我将多选参数传递给另一个多选参数时使用的.

=SPLIT(JOIN(Parameters!.Value,","),",")


这有效.非常有帮助.很难找到这个提示.

3> John Sansom..:

这是SQL Reporting Services中支持不佳的功能之一.

您需要做的是将所有选定项目作为单个字符串传递给存储过程.字符串中的每个元素都用逗号分隔.

然后我做的是使用一个函数拆分字符串,该函数将提供的字符串作为表返回.见下文.

ALTER FUNCTION [dbo].[fn_MVParam]
   (@RepParam nvarchar(4000), @Delim char(1)= ',')
RETURNS @Values TABLE (Param nvarchar(4000))AS
  BEGIN
  DECLARE @chrind INT
  DECLARE @Piece nvarchar(100)
  SELECT @chrind = 1 
  WHILE @chrind > 0
    BEGIN
      SELECT @chrind = CHARINDEX(@Delim,@RepParam)
      IF @chrind  > 0
        SELECT @Piece = LEFT(@RepParam,@chrind - 1)
      ELSE
        SELECT @Piece = @RepParam
      INSERT  @Values(Param) VALUES(CAST(@Piece AS VARCHAR))
      SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
      IF LEN(@RepParam) = 0 BREAK
    END
  RETURN
  END

然后,您可以在主查询的where子句中引用结果,如下所示:

where someColumn IN(SELECT Param FROM dbo.fn_MVParam(@sParameterString,','))

我希望你发现这个解决方案有用.如果您有任何问题,请随时提出.

干杯,约翰



4> CodeGrue..:

John Sansom和Ed Harper有很好的解决方案.但是,在处理ID字段(即整数)时,我无法让它们工作.我修改了下面的split函数,将值作为整数CAST,因此表将与主键列连接.我还评论了代码并添加了一个订单列,以防定界列表顺序很重要.

CREATE FUNCTION [dbo].[fn_SplitInt]
(
    @List       nvarchar(4000),
    @Delimiter  char(1)= ','
)
RETURNS @Values TABLE
(
    Position int IDENTITY PRIMARY KEY,
    Number int
)

AS

  BEGIN

  -- set up working variables
  DECLARE @Index INT
  DECLARE @ItemValue nvarchar(100)
  SELECT @Index = 1 

  -- iterate until we have no more characters to work with
  WHILE @Index > 0

    BEGIN

      -- find first delimiter
      SELECT @Index = CHARINDEX(@Delimiter,@List)

      -- extract the item value
      IF @Index  > 0     -- if found, take the value left of the delimiter
        SELECT @ItemValue = LEFT(@List,@Index - 1)
      ELSE               -- if none, take the remainder as the last value
        SELECT @ItemValue = @List

      -- insert the value into our new table
      INSERT INTO @Values (Number) VALUES (CAST(@ItemValue AS int))

      -- remove the found item from the working list
      SELECT @List = RIGHT(@List,LEN(@List) - @Index)

      -- if list is empty, we are done
      IF LEN(@List) = 0 BREAK

    END

  RETURN

  END

使用此功能,如前所述:

WHERE id IN (SELECT Number FROM dbo.fn_SplitInt(@sParameterString,','))



5> Jeff..:

甲骨文:

“ IN”短语(“ ED解决方案”)不适用于Oracle连接(至少是10版)。但是,发现了这种简单的解决方法。使用数据集的参数选项卡,将多值参数转换为CSV:

    :name =join(Parameters!name.Value,",")

然后在您的SQL语句的WHERE子句中,使用instring函数检查是否匹配。

    INSTR(:name, TABLE.FILENAME) > 0

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有