我从存储过程得到以下输出,并想知道将值拆分为多行的最佳方法。
reference name subjects subjectstitle
LL9X81MT Making and Decorating Pottery F06,F27,F38 NULL
我需要修剪逗号的subject字段并将信息复制三行,以便数据如下。
reference name subjects subjectstitle
LL9X81MT Making and Decorating Pottery F06 NULL
LL9X81MT Making and Decorating Pottery F27 NULL
LL9X81MT Making and Decorating Pottery F38 NULL
我正在使用MS SQL Server 2008来设置这些SP,并且需要一些关于如何拆分主题字段的帮助。
谢谢,
答案 0 :(得分:15)
您将需要使用某种类似于此的表值拆分函数:
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;
然后,您可以使用outer apply
加入yourtable:
select t1.reference,
t1.name,
t1.subjectstitle,
i.items subjects
from yourtable t1
outer apply dbo.split(t1.subjects, ',') i
给出这样的结果:
| 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 |
如果你想在没有分割功能的情况下这样做,那么你可以使用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
答案 1 :(得分:9)
这将没有分割功能
SELECT T1.reference, T1.name, T2.my_Splits AS subjects, T1.subtitile
FROM
(
SELECT *,
CAST('<X>'+replace(T.subjects,',','</X><X>')+'</X>' as XML) as my_Xml
FROM [yourTable] T
) T1
CROSS APPLY
(
SELECT my_Data.D.value('.','varchar(50)') as my_Splits
FROM T1.my_Xml.nodes('X') as my_Data(D)
) T2