我的报告中有几个Multi-Select参数.我试图找到一种方法来传递Web查询字符串中的单个参数的多个值?如果我传入单个值,它可以正常工作.
报告运行良好,为单个参数选择多个选项.我的麻烦在于Web查询字符串.
尽管John Sansom的解决方案有效,但还有另一种方法可以做到这一点,而不必使用可能效率低下的标量值UDF.在SSRS报告中,在查询定义的参数选项卡上,将参数值设置为
=join(Parameters!.Value,",")
在您的查询中,您可以像这样引用值:
where yourColumn in (@)
这是我将多选参数传递给另一个多选参数时使用的.
=SPLIT(JOIN(Parameters!.Value,","),",")
这是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,','))
我希望你发现这个解决方案有用.如果您有任何问题,请随时提出.
干杯,约翰
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,','))
甲骨文:
“ IN”短语(“ ED解决方案”)不适用于Oracle连接(至少是10版)。但是,发现了这种简单的解决方法。使用数据集的参数选项卡,将多值参数转换为CSV:
:name =join(Parameters!name.Value,",")
然后在您的SQL语句的WHERE子句中,使用instring函数检查是否匹配。
INSTR(:name, TABLE.FILENAME) > 0