2017-01-25 9 views
2

У меня есть сценарий, в котором у меня есть данные, как показано ниже в таблице #Testdata temp.Несколько столбцов разделенных запятыми столбцов на несколько строк

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  | |  | 

Любые ответы будут очень признательны.

Благодаря

ответ

2

Использование Jeff Moden's string split function вы можете сделать следующее, чтобы получить выход вам нужно, хотя я уверен, что есть более эффективный способ ...

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; 
2

Вы можете, например, установить на DelimitedSplit8k Джеффа Moden. Набор результатов будет содержать как номер элемента, так и номер позиции, поэтому с номером позиции вы можете присоединиться к двум строкам, которые вы разделите.