Ti consigliamo di utilizzare una sorta di funzione di divisione con valori di tabella simile a questa:
create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))
returns @temptable TABLE (items varchar(MAX))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end;
Puoi quindi utilizzare outer apply
per partecipare a yourtable:
select t1.reference,
t1.name,
t1.subjectstitle,
i.items subjects
from yourtable t1
outer apply dbo.split(t1.subjects, ',') i
Dare un risultato come questo:
| REFERENCE | NAME | SUBJECTSTITLE | SUBJECTS |
------------------------------------------------------------------------
| LL9X81MT | Making and Decorating Pottery | (null) | F06 |
| LL9X81MT | Making and Decorating Pottery | (null) | F27 |
| LL9X81MT | Making and Decorating Pottery | (null) | F38 |
Vedi SQL fiddle con Demo
Se vuoi farlo senza una funzione di divisione, puoi usare CTE:
;with cte (reference, name, subjectstitle, subjectitem, subjects) as
(
select reference,
name,
subjectstitle,
cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) subjectitem,
stuff(subjects, 1, charindex(',',subjects+','), '') subjects
from yourtable
union all
select reference,
name,
subjectstitle,
cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) ,
stuff(subjects, 1, charindex(',',subjects+','), '') subjects
from cte
where subjects > ''
)
select reference, name, subjectstitle, subjectitem
from cte
Vedi SQL Fiddle con demo