【问题标题】:How to get the number of elements in a SSRS multi-value paramter如何获取 SSRS 多值参数中的元素数量
【发布时间】:2011-08-12 11:24:28
【问题描述】:

我有一个 SQL Server Reporting Service 表单,它可以查询和显示多年的指标。

表单可以选择接收它应该显示为参数的年份。我遇到的问题是指定“如果未设置@year,则包括所有内容,否则限制为指定的年份。”

我目前的查询是:

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( len( @year ) = 0 OR collected_year IN ( @year ) )
   AND competency_id = @competency_id

当@year 为空时有效,但在传递多个值时失败并出现错误The len function requires 1 argument.。

我试过count( @year ) 和DataLength( @year ) 都没有成功。

【问题讨论】:

  • @year 是多值参数吗?如果是,那么你必须至少选择一个值

标签: tsql reporting-services ssis


【解决方案1】:

好的,我知道这是陈旧的,但我想我现在有了答案。

您可以将另一个参数设置为多值参数的计数并将其传递到查询中。所以你最终会在 SQL 端得到这个:

SELECT name, collected_year, value, [order]
  FROM rpt_competency_metric
 WHERE ( @mvpCount = 0 OR collected_year IN ( @year ) )
   AND competency_id = @competency_id 

在 RS 方面,您可以使用表达式将 @mvpCount 设置为您的 @year 计数:

=Parameters!Year.Count

我没有尝试过,但我认为它会起作用。

【讨论】:

    【解决方案2】:

    谢谢,奎索。

    您在下面建议的解决方案很有魅力。我和它打了半天多。

    SELECT 
        name
      , collected_year
      , value
      , [order] 
    FROM rpt_competency_metric 
    WHERE ( len('@year') = 0 
        OR collected_year IN ( @year ) )   
        AND competency_id = @competency_id 
    

    【讨论】:

      【解决方案3】:

      我在网上没有找到令人满意的答案,所以经过深思熟虑和祈祷后,我想出了这个解决方案。

      我和其他人遇到的麻烦是,处理 SSRS 多值变量的唯一方法是添加 where 子句:

      Table.FieldName in (@MultiValue)
      

      所以要检查@MultiValue 变量中是否有内容,您需要执行以下操作。在查询字段或存储过程中,您需要确定是否进行了任何选择并将它们填充到内存中的 sql 表中。然后在另一个查询中获取行数并将其填充到变量中。然后在查询中使用该变量来确定您是否应该根据该条件进行搜索。

      这是一个 SQL 示例:

      DECLARE @GroupCnt int;
      Declare @TblGroup Table (GroupID int);
      
      Insert INTO @TblGroup (GroupID)
      SELECT ItemID
      FROM Groups
      WHERE ItemId in (@Group)
      
      SELECT @GroupCnt = COUNT(*)
      From @TblGroup
      
      SELECT        CAST(ItemId AS Varchar(10)) AS ProviderID, ProviderShortName AS Location
      FROM            Provider as prov
      WHERE        (IsActive = 1)
          and (@GroupCnt = 0 or prov.GroupId in (@Group)) 
      UNION ALL
      SELECT        '' AS ProviderID, '(NONE)' AS Location
      ORDER BY Location
      

      “and (@GroupCnt = 0 or prov.GroupId in (@Group))”代码是魔法发生的地方,但为了做到这一点,您必须从前两个查询中获取 @GroupCnt 变量。

      仅供参考,我添加了 UNION ALL 以便用户可以选择不选择任何选项。

      【讨论】:

        【解决方案4】:

        多值参数转换为逗号分隔的列表。所以当你使用 len 函数时,你最终会得到这个:

        SELECT name, collected_year, value, [order]
              FROM rpt_competency_metric
             WHERE ( len(2007,2008) = 0 OR collected_year IN ( 2007,2008 ) )
               AND competency_id = @competency_id
        

        这也解释了您的错误。其中一种可能有效,但我尚未对其进行测试:

        SELECT name, collected_year, value, [order]
          FROM rpt_competency_metric
         WHERE ( @year is null OR collected_year IN ( @year ) )
           AND competency_id = @competency_id
        

        或者:

        SELECT name, collected_year, value, [order]
          FROM rpt_competency_metric
         WHERE ( rtrim(ltrim(convert(varchar,'@year'))) = '' OR collected_year IN ( @year ) )
           AND competency_id = @competency_id
        

        在@year 周围加和不加单引号的情况下尝试上述方法。

        不知道 SSRS 对文字字符串中的多值参数做了什么,但如果它完全替换它,这可能会起作用,这与你所拥有的很接近:

        SELECT name, collected_year, value, [order]
          FROM rpt_competency_metric
         WHERE ( len('@year') = 0 OR collected_year IN ( @year ) )
           AND competency_id = @competency_id
        

        【讨论】:

        • 不幸的是,变量没有在引号内展开,所以 '@year' 不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多