将值拆分为多行

Pip*_*Boy 6 sql sql-server stored-procedures sql-server-2008

可能重复:
将逗号分隔的字符串转换为单独的行

我有一个存储过程的以下输出,并想知道将值拆分为多行的最佳方法.

reference   name                            subjects       subjectstitle
LL9X81MT    Making and Decorating Pottery   F06,F27,F38       NULL
Run Code Online (Sandbox Code Playgroud)

我需要在逗号处修剪主题字段并将信息复制到三行,以便数据如下所示.

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
Run Code Online (Sandbox Code Playgroud)

我正在使用MS SQL Server 2008来设置这些SP,并且需要一些关于如何分割主题字段的帮助.

谢谢,

Tar*_*ryn 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;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用outer applyyourtable加入:

select t1.reference,
  t1.name,
  t1.subjectstitle,
  i.items subjects
from yourtable t1
outer apply dbo.split(t1.subjects, ',') i
Run Code Online (Sandbox Code Playgroud)

给出这样的结果:

| 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 |
Run Code Online (Sandbox Code Playgroud)

请参阅SQL小提琴演示

如果你想在没有拆分功能的情况下这样做,那么你可以使用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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo


Kaf*_*Kaf 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
Run Code Online (Sandbox Code Playgroud)

  • 非常好.效果很好. (2认同)