有几种方法可以做到这一点。我建议的一种方法是将逗号分隔列表中的数据拆分为多行。
由于您使用的是 SQL Server,因此您可以实现递归 CTE 来拆分数据,然后应用 PIVOT 函数来创建所需的列。
;with cte (id, NameItem, Name, textItem, text) as
(
  select id,
    cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) NameItem,
    stuff(Name, 1, charindex(',',Name+','), '') Name,
    cast(left(text, charindex(',',text+',')-1) as varchar(50)) textItem,
    stuff(text, 1, charindex(',',text+','), '') text
  from yt
  union all
  select id,
    cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) NameItem,
    stuff(Name, 1, charindex(',',Name+','), '') Name,
    cast(left(text, charindex(',',text+',')-1) as varchar(50)) textItem,
    stuff(text, 1, charindex(',',text+','), '') text
  from cte
  where Name > ''
    and text > ''
) 
select id, SID, DOB
into table1
from
(
  select id, nameitem, textitem
  from cte
  where nameitem in ('SID', 'DOB')
) d
pivot
(
  max(textitem)
  for nameitem in (SID, DOB)
) piv;
请参阅SQL Fiddle with Demo。递归版本会很好用,但如果你有一个大数据集,你可能会遇到一些性能问题,所以你也可以使用用户定义的函数来拆分数据:
create FUNCTION [dbo].[Split](@String1 varchar(MAX), @String2 varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (colName varchar(MAX), colValue varchar(max))       
as       
begin      
    declare @idx1 int       
    declare @slice1 varchar(8000)  
    declare @idx2 int       
    declare @slice2 varchar(8000)     
    select @idx1 = 1       
        if len(@String1)<1 or @String1 is null  return       
    while @idx1 != 0       
    begin       
        set @idx1 = charindex(@Delimiter,@String1)  
        set @idx2 = charindex(@Delimiter,@String2) 
        if @idx1 !=0    
          begin
            set @slice1 = left(@String1,@idx1 - 1)   
            set @slice2 = left(@String2,@idx2 - 1)  
          end
        else  
          begin
            set @slice1 = @String1   
            set @slice2 = @String2
          end
        if(len(@slice1)>0)  
            insert into @temptable(colName, colValue) values(@slice1, @slice2)       
        set @String1 = right(@String1,len(@String1) - @idx1) 
        set @String2 = right(@String2,len(@String2) - @idx2) 
        if len(@String1) = 0 break       
    end   
return 
end;
然后您可以使用 CROSS APPLY 来获取每一行的结果:
select id, SID, DOB
into table1
from
(
  select t.id,
    c.colname,
    c.colvalue
  from yt t
  cross apply dbo.split(t.name, t.text, ',') c
  where c.colname in ('SID', 'DOB')
) src
pivot
(
  max(colvalue)
  for colname in (SID, DOB)
) piv;
请参阅带有演示的 SQL Fiddle