??SQL2000??ntext?bug?
CREATE FUNCTION [dbo].[Fn_split] (@expression NTEXT, @delimiter NVARCHAR(2) = ',') RETURNS @expressionstable TABLE ( [DUMMY] NVARCHAR(4000)) AS BEGIN DECLARE @currentindex INT DECLARE @nextindex INT DECLARE @returntext NVARCHAR(4000) DECLARE @datalength INT IF @expression IS NULL BEGIN INSERT INTO @expressionstable ([DUMMY]) VALUES (NULL) END ELSE BEGIN SELECT @datalength = Datalength(@expression) / 2 IF @datalength = 0 INSERT INTO @expressionstable ([DUMMY]) VALUES ('') ELSE BEGIN SELECT @currentindex = 1 WHILE( @currentindex <= @datalength ) BEGIN SELECT @nextindex = Charindex(@delimiter, Substring(@expression, @currentindex, 4000)) + @currentindex /*????Charindex????????8000??????????????*/ IF( @nextindex = @currentindex ) SELECT @nextindex = @currentindex + @datalength SELECT @returntext = Substring(@expression, @currentindex - 1, @nextindex - @currentindex) INSERT INTO @expressionstable ([DUMMY]) VALUES (@returntext) SELECT @currentindex = @nextindex + 1 END END END RETURN END
CREATE FUNCTION [dbo].[Fn_split] (@str VARCHAR(MAX), @separator VARCHAR(10)) RETURNS TABLE AS RETURN (SELECT T0.DUMMY FROM ( (SELECT [DUMMY] = CONVERT(XML, '<DUMMY>' + Replace(@str, @separator, '</DUMMY><DUMMY>') + '</DUMMY>')) T1 OUTER APPLY (SELECT DUMMY = N.v.value('.', 'NVARCHAR(4000)') FROM T1.[DUMMY].nodes('/DUMMY') N(v)) T0 ))
???
SELECT * FROM fn_split('1,2,3,4,5', ',');