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