我有一个内联表值函数,它根据指定分隔符将字符串拆分为子字符串行。
具体如下:
ALTER FUNCTION [dbo].[SplitString]
(@List NVARCHAR(MAX),
@Delim VARCHAR(255))
RETURNS TABLE
AS
RETURN
(SELECT [Value], idx = RANK() OVER (ORDER BY n)
FROM
(SELECT
n = Number,
[Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
FROM
(SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
FROM sys.all_objects) AS x
WHERE Number <= LEN(@List)
AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim) AS y
);
GO
用法:
SELECT value
FROM dbo.SplitString('a|b|c', '|')
退货:
| 价值观|
| - -|
| 一种|
| B|
| C语言|
但是,当发送空值作为第一个参数时,它不会返回任何内容。
例如:
SELECT value FROM dbo.SplitString('','|')
这不会传回任何东西。
我需要对dbo.SplitString
函数做什么修改,以便当一个空字符串作为第一个参数传入时,它返回一个空结果集?
PS:由于兼容性问题,我不能使用内置的STRING_SPLIT
函数。
2条答案
按热度按时间q0qdq0h21#
DelimitedSplit8K_LEAD(如上所述)将始终返回一行,并且速度会更快。
也就是说,为了便于学习,让我们修改一下函数。如果用分隔符替换一个空值,就可以得到想要的结果。只需要替换
@list with
ISNULL(NULLIF(@List,''),@Delim)的每个示例。现在,您有:现在,当您执行:声明@列表VARCHAR(最大值)=',@分隔符VARCHAR(255)= '|'
您可以获得:
3yhwsihp2#
感谢@Larnu和@Bernie的所有建议。
经过这么多的研究,我开始迭代并得到预期的结果。我通过简单的while循环和SQL的字符串函数实现了这一点。
这适用于所有情况
1)当实际字符串为空字符串(如
select * from [dbo].[SplitString]('',',')
)时2)当实际字符串结尾为空字符串时,如
select * from [dbo].[SplitString]('a,b,',',')