• The code I use to split out delimited list is:

    create function [dbo].[Split](@value nvarchar(max), @delimiter varchar(20))

    returns @results table (id int identity(1, 1) primary key, value nvarchar(max))

    as

    begin

    declare @p1 int,

    @p2 int

    -- ensure value ends with the delimiter character

    if right(@value, len(@delimiter)) != @delimiter

    set @value = @value + @delimiter

    set @p1 = 1

    set @p2 = charindex(@delimiter, @value)

    while @p2 > @p1

    begin

    insert into @results (value)

    select substring(@value, @p1, @p2 - @p1)

    set @p1 = @p2 + len(@delimiter)

    set @p2 = charindex(@delimiter, @value, @p1)

    end

    return

    end

    go

    My initial tests show it to perform faster than your CTE based solution, but I would welcome other peoples results.