Results 1 to 7 of 7

Thread: SQL Server 2005 - Split string into table using WITH recursion (no loops)

Threaded View

  1. #1

    Thread Starter
    PowerPoster
    Join Date
    Feb 2002
    Location
    Canada, Toronto
    Posts
    5,803

    SQL Server 2005 - Split string into table using WITH recursion (no loops)

    This code is faster than using loops
    sql Code:
    1. -- =============================================
    2. -- Author:      <Michael Ciurescu>
    3. -- Create date: <20091104>
    4. -- Description: <Split string into table, separator can be more than 1 char>
    5. -- =============================================
    6. CREATE FUNCTION [dbo].[fn_SplitStringToTable]
    7. (
    8.       @DataList NVARCHAR(MAX)
    9.     , @Separator NVARCHAR(MAX)
    10. )
    11. RETURNS @tbl TABLE (
    12.       RowIndex INT PRIMARY KEY
    13.     , FromPos INT
    14.     , ToPos INT
    15.     , ItemData NVARCHAR(MAX)
    16. )
    17. AS
    18. BEGIN
    19.     -- SELECT * FROM dbo.fn_SplitStringToTable('123,43,5465,6788,1231,111', ',')
    20.    
    21.     DECLARE @LenSep INT
    22.     SET @LenSep = DATALENGTH(@Separator) / 2
    23.    
    24.     IF @LenSep > 0 AND DATALENGTH(@DataList) > 0 BEGIN
    25.         ; WITH res (RowIndex, FromPos, ToPos) AS (
    26.             SELECT CAST(1 AS INT) AS RowIndex
    27.                 , CAST(1 AS INT) AS FromPos
    28.                 , CAST(CHARINDEX(@Separator, @DataList + @Separator) AS INT) AS ToPos
    29.            
    30.             UNION ALL
    31.            
    32.             SELECT CAST(RowIndex + 1 AS INT) AS RowIndex
    33.                 , CAST(res.ToPos + @LenSep AS INT) AS FromPos
    34.                 , CAST(CHARINDEX(@Separator, @DataList + @Separator, ToPos + @LenSep) AS INT) AS ToPos
    35.             FROM res
    36.             WHERE CHARINDEX(@Separator, @DataList + @Separator, ToPos + @LenSep) > 0
    37.         )
    38.         INSERT INTO @tbl
    39.         SELECT res.*, SUBSTRING(@DataList, FromPos, ToPos - FromPos) AS ItemData
    40.         FROM res
    41.         OPTION (MAXRECURSION 0)
    42.     END
    43.    
    44.     RETURN
    45. END
    Last edited by CVMichael; Dec 15th, 2011 at 11:18 AM.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width