/*
-- Title : [SQL2016] String_Split w/Sequence
-- Reference :
-- Tag : string_split 문자열 구분자 시퀀스 순서
*/
■ 구분자로 구성된 문자열 분리할 때 Index 생성 함수(NULL 유무 포함)
CREATE FUNCTION [dbo].[fn_string_split_idx]
( @String nvarchar(max), @Separator nvarchar(10), @null_yn bit)
RETURNS TABLE
/*
select * from dbo.fn_string_split_idx('e,f,g,,e,e', ',', 0);
select * from dbo.fn_string_split_idx('e,f,g,,e,e', ',', 1);
*/
AS
RETURN
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS "Idx", value AS sValue
FROM STRING_SPLIT(@String, @Separator)
WHERE 1 = 1
and value <> (CASE WHEN @null_yn = 1 THEN '' ELSE '!@#$%안나올만한거^&*()' END)
)

■ 구분자로 구성된 문자열 분리할 때 Index 생성 함수(NULL 유무, Distinct 여부 포함)
CREATE FUNCTION dbo.fn_string_split_seq
(@string nvarchar(max), @Separator NVARCHAR(10), @null_yn BIT, @distinct_yn BIT)
RETURNS @rslt TABLE (
Seq INT NULL,
sValue NVARCHAR(max) NULL
)
/*
select * from dbo.fn_string_split_seq('e,f,g,,e,e', ',', 0, 0);
select * from dbo.fn_string_split_seq('e,f,g,,e,e', ',', 1, 0);
select * from dbo.fn_string_split_seq('e,f,g,,e,e', ',', 1, 1);
*/
AS
BEGIN
DECLARE @temp TABLE
(
Seq INT IDENTITY(1,1)
, sValue NVARCHAR(MAX)
)
INSERT INTO @temp
SELECT value
FROM string_split(@string, @Separator)
IF( @null_yn = 1 )
BEGIN
DELETE
FROM @temp
WHERE sValue = ''
END
IF( @distinct_yn = 1 )
BEGIN
INSERT INTO @rslt
SELECT ROW_NUMBER() OVER ( ORDER BY Seq) Seq
, sValue
FROM
(
SELECT MIN(Seq) Seq, sValue
FROM @temp
GROUP BY sValue
) a
RETURN
END
ELSE
INSERT INTO @rslt
SELECT ROW_NUMBER() OVER ( ORDER BY Seq) Seq
, sValue
FROM @temp
RETURN
END

■ 제공 버전
Azure SQL Server에서는 제공되나 SQL Server 2017에서는 지원되지 않는 것 확인