I had a little more fun... again using 17,000+ tokens.
I put the CTE version inside the original function by creating 200 character tokens using the original method (sort of), assuming a single character delimiter, then using CTE to further split them into arrays. It still has a few bugs but it did improve the overall results (hopefully, not due to the bugs):
Original + CTE Hybrid:CPU time = 468 ms, elapsed time = 473 ms.
Original:CPU time = 686 ms, elapsed time = 734 ms.
Tally:CPU time = 172 ms, elapsed time = 157 ms.
CREATE FUNCTION [dbo].[fn_Split_Hybrid]
(
@InputString VARCHAR(max),
@Delimiter char(1)
)
RETURNS @Values TABLE (
VALUE VARCHAR(max)
-- ,IPS VARCHAR(MAX)
--,DCI BIGINT
)
AS
BEGIN
DECLARE @DelimitierLen tinyint = 200
DECLARE @DelimiterCharIndex bigint = @DelimitierLen --BIGINT = CHARINDEX(@Delimiter,@InputString)
WHILE (@DelimiterCharIndex >= @DelimitierLen )
BEGIN
declare @newval varchar(200) = left(@InputString, @DelimitierLen)
SET @InputString = SUBSTRING(@InputString,@DelimitierLen+1, LEN(@InputString)-@DelimitierLen)
SET @DelimiterCharIndex = LEN(@inputString)
--INSERT INTO @Values VALUES (@newval)--, @InputString,@DelimiterCharIndex)
BEGIN
with split(i, token, remainder) as
(select 1
, left(@newval,charindex(@Delimiter,@newval)-1)
, LTRIM(right(@newval,len(@newval)-CHARINDEX(@Delimiter,@newval)))
union all
select i + 1
,case when charindex(@Delimiter,remainder) > 0 then
left(remainder,charindex(@Delimiter,remainder)-1)
else remainder end as token
,LTRIM(right(remainder,len(remainder)-CHARINDEX(@Delimiter,remainder))) as remainder
from split
where charindex(@Delimiter,remainder) >= 0 and token != remainder
)
insert into @Values
Select token
from split
END
END
set @newval = @InputString
BEGIN
with split(i, token, remainder) as
(select 1
, left(@newval,charindex(@Delimiter,@newval)-1)
, LTRIM(right(@newval,len(@newval)-CHARINDEX(@Delimiter,@newval)))
union all
select i + 1
,case when charindex(@Delimiter,remainder) > 0 then
left(remainder,charindex(@Delimiter,remainder)-1)
else remainder end as token
,LTRIM(right(remainder,len(remainder)-CHARINDEX(@Delimiter,remainder))) as remainder
from split
where charindex(@Delimiter,remainder) >= 0 and token != remainder
)
insert into @Values
Select token
from split
END
RETURN
END
GO