• Another way to do it is by using the Tally table. Check out Jeff Moden's article http://www.sqlservercentral.com/articles/T-SQL/62867/.

    Here's some example code (how i use it on our systems):

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    CREATE FUNCTION [dbo].[udfTransformStringToColumn] (

    @StringVARCHAR(MAX),

    @DelimiterVARCHAR(1)

    )

    RETURNS @List TABLE (ValueColumn VARCHAR(255) NULL)

    AS

    BEGIN

    IF LEFT(@String, 1) <> @Delimiter SET @String = @Delimiter + @String

    IF RIGHT(@String, 1) <> @Delimiter SET @String = @String + @Delimiter

    ;WITH

    cteTally AS

    (

    SELECTTOP (LEN(@String))

    ROW_NUMBER() OVER (ORDER BY t1.Object_ID) AS N

    FROMMaster.sys.All_Columns t1

    CROSS JOIN Master.sys.All_Columns t2

    )INSERT INTO @List (ValueColumn)

    SELECTSUBSTRING(@String,N+1,CHARINDEX(@Delimiter,@String,N+1)-N-1) AS Value

    FROMcteTally

    WHEREN < LEN(@String)

    AND SUBSTRING(@String,N,1) = @Delimiter

    RETURN

    END

    GO