• CTE version, made more like the SUBSTRING version:

    CREATE FUNCTION [dbo].[fnStringSplit_CTE]

    (

    @SourceString VARCHAR(MAX),

    @Delim CHAR(1)

    )

    RETURNS @Values TABLE

    (

    VALUE VARCHAR(MAX)

    )

    AS

    BEGIN

    with split(i, token, remainder) as

    (select 1

    , left(@SourceString,charindex(@delim,@SourceString)-1)

    , LTRIM(right(@SourceString,len(@SourceString)-CHARINDEX(@delim,@SourceString)))

    union all

    select i + 1

    ,case when charindex(@delim,remainder) > 0 then

    left(remainder,charindex(@delim,remainder)-1)

    else remainder end as token

    ,LTRIM(right(remainder,len(remainder)-CHARINDEX(@Delim,remainder))) as remainder

    from split

    where charindex(@delim,remainder) >= 0 and token != remainder

    )

    insert into @Values

    Select token

    from split

    RETURN

    END

    GO