declare @T table(ID int, SN varchar(100), Types varchar(1000))
insert into @T
select 1, 123, 'ABC,XYZ,TEST' union all
select 2, 234, 'RJK,CDF,TTT,UMB,UVX' union all
select 4, 234, 'XXX' union all
select 3, 345, 'OID,XYZ'
;with cte(ID, SN, Types, Rest) as
(
select ID,
SN,
cast(substring(Types+',', 1, charindex(',', Types+',')-1) as varchar(100)),
stuff(Types, 1, charindex(',', Types), '')+','
from @T
where len(Types) > 0
union all
select ID,
SN,
cast(substring(Rest, 1, charindex(',', Rest)-1) as varchar(100)),
stuff(Rest, 1, charindex(',', Rest), '')
from cte
where len(Rest) > 0
)
select ID, SN, Types
from cte
order by ID
Я использую рекурсивный CTE для разбиения строки. Третий столбец Types
заполняется первым словом в столбце Типы @T. Stuff
удалит первое слово и заполнит столбец Rest, который будет содержать все, кроме первого слова. После UNION ALL это рекурсивная часть, которая в основном делает то же самое, но использует CTE в качестве источника и использует столбец rest
для выбора первого слова. Первое слово в столбце rest
удаляется с помощью stuff
, а затем ..... ну, это рекурсивно, поэтому я остановлюсь здесь на пояснениях Рекурсивная часть заканчивается, когда больше не осталось слов
where len(Rest) > 0
.