Эффективный способ разделения строк с помощью CTE

У меня есть таблица, которая выглядит как

ID  Layout
1   hello,world,welcome,to,tsql
2   welcome,to,stackoverflow

Желаемый результат должен быть

Id  Splitdata
1   hello
1   world
1   welcome
1   to
1   tsql
2   welcome
2   to
2   stackoverflow

Я сделал это с помощью следующего запроса

Declare @t TABLE(
    ID  INT IDENTITY PRIMARY KEY,
    Layout VARCHAR(MAX)
)
INSERT INTO @t(Layout)
SELECT 'hello,world,welcome,to,tsql' union all
SELECT 'welcome,to,stackoverflow'
--SELECT * FROM @t
;With cte AS(
select F1.id
 ,O.splitdata 
 from
 (
 select *,
 cast('<X>'+replace(F.Layout,',','</X><X>')+'</X>' as XML) as xmlfilter
 from @t F
 )F1
 cross apply
 ( 
 select fdata.D.value('.','varchar(MAX)') as splitdata 
 from f1.xmlfilter.nodes('X') as fdata(D)) O
 )

 select * from cte

Но с точки зрения производительности это очень плохо. Я ищу более эффективный запрос, но использую только CTE.

7
задан Luke Girvin 10 July 2019 в 11:18
поделиться