我在数据库中有以下SQL函数:
ALTER FUNCTION [dbo].[Split_Using] (@StringToSplit varchar(8000),
@Separator varchar(128))
RETURNS TABLE
AS
RETURN
WITH Indices
AS (SELECT
0 Start,
1 Ends
UNION ALL
SELECT
Ends,
CHARINDEX(@Separator, @StringToSplit, Ends) + LEN(@Separator)
FROM Indices
WHERE Ends > Start)
SELECT
SUBSTRING(@StringToSplit, Start, CASE
WHEN Ends > LEN(@Separator) THEN Ends - Start - LEN(@Separator)
ELSE LEN(@StringToSplit) - Start + 1
END) Id
FROM Indices
WHERE Start > 0
即使我已经知道它返回了什么(将字符串分成块,由分隔字符串定义,例如Split_Using('a,b,c',',')
会返回一个('a' 'b' 'c')
表,我想知道:
答案 0 :(得分:4)
这是使用递归公用表表达式(CTE)。在这种情况下WITH Indices
部分。 '锚点#39;表达式是UNION ALL
之前的第一部分,第二部分是递归地返回Indices
。
这些的MSDN文档在这里: https://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx