Querrá usar algún tipo de función de división de valores de tabla similar a esta:
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;
Luego puede usar outer apply
para unirse a su mesa:
select t1.reference,
t1.name,
t1.subjectstitle,
i.items subjects
from yourtable t1
outer apply dbo.split(t1.subjects, ',') i
Dando un resultado como este:
| 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 |
Ver violín SQL con demostración
Si desea hacer esto sin una función dividida, puede usar 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
Ver SQL Fiddle con demostración