Sql server 将多个逗号分隔的字符串列转换为多行

Sql server 将多个逗号分隔的字符串列转换为多行,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有一个场景,在Testdata临时表中有如下数据 create table #Testdata(SomeID int, OtherID int, Data varchar(max), Data2 VARCHAR(MAX)) insert #Testdata select 1, 9, '18,20,22', '12,13' insert #Testdata select 2, 8, '17,19', '' insert #Testdata select 3, 7, '13,19,20', '14

我有一个场景,在Testdata临时表中有如下数据

create table #Testdata(SomeID int, OtherID int, Data varchar(max), Data2 VARCHAR(MAX))
insert #Testdata select 1, 9, '18,20,22', '12,13'
insert #Testdata select 2, 8, '17,19', ''
insert #Testdata select 3, 7, '13,19,20', '14,,50'
insert #Testdata select 4, 6, '', ''
现在我需要显示结果如下

|SomeId|OtherID|Data|Data2|
|1     |9      |18  |12   |
|1     |9      |20  |13   |
|1     |9      |22  |     |
|2     |8      |17  |     |
|2     |8      |19  |     |
|3     |7      |13  |14   |
|3     |7      |19  |     |
|3     |7      |10  |50   |
|4     |6      |    |     |
如有任何回复,将不胜感激


谢谢

例如,您可以安装Jeff Moden提供的。结果集将包含项目和项目编号,因此使用项目编号可以将拆分的两个字符串连接在一起。

例如,您可以安装Jeff Moden提供的。结果集将同时包含项目和项目编号,因此使用项目编号,您可以将拆分的两个字符串连接在一起。

使用,您可以执行以下操作以获得所需的输出,尽管我相信有一种更有效的方法

declare @Testdata table(SomeID int, OtherID int, Data varchar(max), Data2 VARCHAR(MAX));
insert @Testdata select 1, 9, '18,20,22', '12,13';
insert @Testdata select 2, 8, '17,19', '';
insert @Testdata select 3, 7, '13,19,20', '14,,50';
insert @Testdata select 4, 6, '', '1,2,3,4,5';

with t1 as
(
    select t.SomeID
            ,t.OtherID
            ,t1.ItemNumber
            ,t1.Item as Data1
    from @Testdata t
        outer apply dbo.DelimitedSplit8K(t.Data,',') t1
), t2 as
(
    select t.SomeID
            ,t.OtherID
            ,t2.ItemNumber
            ,t2.Item as Data2
    from @Testdata t
        outer apply dbo.DelimitedSplit8K(t.Data2,',') t2
)
select isnull(t1.SomeID,t2.SomeID) as SomeID
    ,isnull(t1.OtherID,t2.OtherID) as OtherID
    ,t1.Data1
    ,t2.Data2
from t1
full join t2
    on t1.SomeID = t2.SomeID
        and t1.ItemNumber = t2.ItemNumber;
使用您可以执行以下操作以获得所需的输出,尽管我相信有一种更有效的方法

declare @Testdata table(SomeID int, OtherID int, Data varchar(max), Data2 VARCHAR(MAX));
insert @Testdata select 1, 9, '18,20,22', '12,13';
insert @Testdata select 2, 8, '17,19', '';
insert @Testdata select 3, 7, '13,19,20', '14,,50';
insert @Testdata select 4, 6, '', '1,2,3,4,5';

with t1 as
(
    select t.SomeID
            ,t.OtherID
            ,t1.ItemNumber
            ,t1.Item as Data1
    from @Testdata t
        outer apply dbo.DelimitedSplit8K(t.Data,',') t1
), t2 as
(
    select t.SomeID
            ,t.OtherID
            ,t2.ItemNumber
            ,t2.Item as Data2
    from @Testdata t
        outer apply dbo.DelimitedSplit8K(t.Data2,',') t2
)
select isnull(t1.SomeID,t2.SomeID) as SomeID
    ,isnull(t1.OtherID,t2.OtherID) as OtherID
    ,t1.Data1
    ,t2.Data2
from t1
full join t2
    on t1.SomeID = t2.SomeID
        and t1.ItemNumber = t2.ItemNumber;