我发现了一个在线UDF,它分割了一个逗号分隔的字符串,目的是从SSRS向它传递一个多值参数。 UDF采用1个参数,即数据类型VARCHAR(MAX)。
当我测试它并发送带有单引号的字符串,例如'001,002,003'时,UDF工作得很好,但据我所知SSRS在没有单引号的情况下传递001,002,003。当这被传递给UDF时,我得到的错误是传递了太多的参数。我在SQL Server Management Studio和SSRS中进行了测试。
我试图找出在将参数发送到SSRS中的UDF之前如何添加单引号。我试过调用UDF并在DECLARE语句中设置传递给''+ @MyVar +''的变量以及UDF的参数。我还尝试使用2个单引号创建另一个变量并连接变量,例如@Quote + @MyVar + @Quote。到目前为止没有任何工作。
这是我正在使用的UDF:
`CREATE FUNCTION [dbo].[SplitQuotedString] (@String varchar(max))
RETURNS @Array TABLE (Item varchar(8000))
AS
BEGIN
DECLARE
@Pos int,
@End int,
@TextLength int,
@Item varchar(8000),
@Fragment varchar(8000),
@InQuotes bit
SET @TextLength = DataLength(@String)
IF @TextLength = 0 RETURN
SET @Pos = 1
SET @InQuotes = 0
SET @String = @String + ','
SET @Item = ''
WHILE 1 = 1 BEGIN
SET @End = CharIndex(',', @String, @Pos)
IF @End = 0 BREAK
SET @Fragment = Substring(@String, @Pos, @End - @Pos)
IF @InQuotes = 1 BEGIN
SET @InQuotes = PatIndex('%[^'']%', Reverse(@Fragment) + 'x') % 2
SET @Item = @Item + ',' + Replace(Left(@Fragment, DataLength(@Fragment) - 1 + @InQuotes), '''''', '''')
END
ELSE BEGIN
IF @Fragment LIKE '''%' BEGIN
SET @InQuotes = 1
SET @Item = Replace(Substring(@Fragment, 1 + @InQuotes, 8000), '''''', '''')
END
ELSE BEGIN
SET @Item = @Fragment
END
END
IF @InQuotes = 0 BEGIN
INSERT @Array (Item) VALUES (@Item)
SET @Item = ''
END
SET @Pos = @End + 1
END
RETURN
END
`
任何帮助将不胜感激
答案 0 :(得分:0)
似乎UDF是个问题。我发现修改并使用了另一个UDF,它在将= JOIN(参数!MyVar.Value,“,”)添加到SSRS中我的数据集的“参数”选项卡后工作。这是我使用的功能:
create function Split (
@StringToSplit varchar(2048),
@Separator varchar(128))
returns table as return
with indices as
(
select 0 S, 1 E
union all
select E, charindex(@Separator, @StringToSplit, E) + len(@Separator)
from indices
where E > S
)
select substring(@StringToSplit,S,
case when E > len(@Separator) then e-s-len(@Separator) else len(@StringToSplit) - s + 1 end) String
,S StartIndex
from indices where S >0