Sql server 将多个逗号分隔的字符串列转换为多行
我有一个场景,在Testdata临时表中有如下数据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
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;