CREATE FUNCTION [dbo].[fnSplit] (@list VARCHAR(8000), @delim CHAR(1) = ',' ) RETURNS TABLE AS RETURN WITH csvtbl(START, stop) AS ( SELECT START = 1, stop = CHARINDEX(@delim COLLATE Slovenian_BIN2, @list + @delim) UNION ALL SELECT START = stop + 1, stop = CHARINDEX(@delim COLLATE Slovenian_BIN2, @list + @delim, stop + 1) FROM csvtbl WHERE stop > 0 ) SELECT row_number() over (order by Start) as ID, LTRIM(RTRIM(SUBSTRING(@list, START, CASE WHEN stop > 0 THEN stop - START ELSE 0 END))) AS VALUE FROM csvtbl WHERE stop > 0Note the UNION ALL part.
>Msg 252, Level 16, State 1, Procedure fnSplit, Line 10 >Recursive common table expression 'csvtbl' does not contain a top-level UNION ALL operator. >>
>SET ANSI_NULLS ON >GO >SET QUOTED_IDENTIFIER ON >GO > >CREATE FUNCTION [dbo].[fnSplit] >( > @list varchar(8000), > @delim CHAR(1) = ',' >) >RETURNS Table >AS > RETURN > WITH csvtbl(START, stop) AS > ( > SELECT START = 1, > Stop = CHARINDEX(@delim COLLATE Slovenian_BIN2, > @list + @delim, stop + 1) > FROM csvtbl > WHERE stop > 0 > ) > SELECT row_number() over (order by START) AS ID, LTRIM(RTRIM(SUBSTRING(@list, START, > CASE WHEN stop > 0 THEN stop - START ELSE 0 END))) > AS VALUE > FROM csvtbl > WHERE stop > 0 >GO >