December 2003 Blog Posts

  • Breaking the 8000 byte limit.

    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) ) GOI originally had an example using 10550 byte text string but it takes up to much real estate.Any problems, optimisations or insults please tell.