I've updated your function slightly:
ALTER FUNCTION [Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
, SplitData AS
(
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
SELECT ID
, NumericData = SUBSTRING(Data, 1, 4)
, TextData = SUBSTRING
(
Data
, 8
, len(Data) - 7
)
FROM SplitData
)
This is giving OK results for me.
See SQL Fiddle with demo.
Edit after comment:
To prevent issues with the recursion limit you need to set MAXRECURSION
outside of the function, i.e. when you're calling it with a SELECT
statement:
SELECT *
FROM dbo.Split
(
N'0009 - The Good Boy Song,0003 - Alphabet Song,0008 - Flame-thrower Guide'
, N','
)
OPTION (MAXRECURSION 0)
You cannot apply the hint in the function as it's written.
See this SO question and this MSDN discussion for further details and other potential workarounds.
One more comment... If you are expecting long strings, maybe you should consider changing the parameter from NVARCHAR(4000)
to NVARCHAR(max)
?