Here is an extension to the CSV to Row function that breaks the 8000 byte varchar limit.
It is only limited to the size of your "Numbers" table (I think)
CREATE FUNCTION RowParser
(
@Text TEXT,
@Separator VARCHAR(3) = ','
)
RETURNS TABLE
AS
RETURN
(
SELECT n,
SUBSTRING(@Text collate database_default, n,
CASE SIGN(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n)
WHEN -1 THEN
CASE PATINDEX('%,%', SUBSTRING(@Text collate database_default, n, ABS(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n)))
WHEN 0 THEN DATALENGTH(@Text)-n+1
ELSE PATINDEX('%,%', SUBSTRING(@Text collate database_default, n, ABS(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n))) -1
END
ELSE ABS(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n)
END) AS Data
, DATALENGTH(@Text)/n AS Position
, CASE SIGN(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n)
WHEN -1 THEN
CASE PATINDEX('%,%', SUBSTRING(@Text collate database_default, n, ABS(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n)))
WHEN 0 THEN DATALENGTH(@Text)-n+1
ELSE PATINDEX('%,%', SUBSTRING(@Text collate database_default, n, ABS(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n))) -1
END
ELSE ABS(CHARINDEX(@Separator collate database_default, @Text collate database_default,n)-n)
END AS NumberStep
FROM Numbers
WHERE n BETWEEN 0 AND (DATALENGTH(@Text) - DATALENGTH(@Separator))
AND ((SUBSTRING(@Text collate database_default,n-DATALENGTH(@Separator),DATALENGTH(@Separator)) = @Separator AND n > 1) OR n = 1)
)
GO
I originally had an example using 10550 byte text string but it takes up to much real estate.
Any problems, optimisations or insults please tell.
Print | posted on Friday, December 12, 2003 11:08 PM