我有以下UDF。
CREATE FUNCTION [dbo].[udf_GenerateVarcharTableFromStringList]
(@list varchar(MAX),
@delimiter char(1) = N',')
RETURNS @tbl TABLE ([Value] varchar(200))
WITH SCHEMABINDING
AS
BEGIN
DECLARE @chrind INT
DECLARE @Piece nvarchar(4000)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@delimiter,@list)
IF @chrind > 0
SELECT @Piece = LEFT(@list,@chrind - 1)
ELSE
SELECT @Piece = @list
INSERT @tbl([Value]) VALUES(@Piece)
SELECT @list = RIGHT(@list,LEN(@list) - @chrind)
IF LEN(@list) = 0 BREAK
END
RETURN
END
我使用以下代码示例从我的sprocs中的where子句调用此函数:
WHERE u.[Owner] IN
(SELECT [VALUE]
FROM dbo.udf_GenerateVarcharTableFromStringList(@Owners, ','))
我在sprocs中使用where where语句,用于报告服务多值参数。当用户只为该值选择空白时,它会返回正确的数据,但如果用户选择空白值而另一个实际具有文本的值,则不再返回空白值所有者,只是文本中的所有者?有任何想法吗?我认为这个功能有问题吗?
答案 0 :(得分:1)
好吧,从你的评论中我可以收集到的,似乎你需要一个新的分裂功能。这是我使用的:
create FUNCTION [dbo].[fnSplitString] (@s varchar(512),@sep char(1))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
它有一个很好的枚举功能,它不会吃掉空白。 :)