如何获取SSRS多值参数中的元素数

时间:2011-04-25 17:35:48

标签: tsql reporting-services ssis

我有一个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 )但未成功。

4 个答案:

答案 0 :(得分:3)

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

您可以将另一个参数设置为多值参数的计数,并将其传递给查询。所以你最终会在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

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

答案 1 :(得分:1)

谢谢,Queso。

您在下面建议的解决方案可以作为魅力。我和它一起战斗了半天。

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

答案 2 :(得分:1)

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

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

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

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

这是SQL中的一个例子:

{{1}}

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

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

答案 3 :(得分:0)

多值参数将转换为逗号分隔列表。所以当你使用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