2012-08-08 47 views
0

我可以使用遊標執行此操作,但我儘可能地避免使用遊標。這是一個有點示例代碼,我已經有了打算:SQL:使用三個分隔符解析關聯輸入字符串

declare @string varchar(max) = 'person1:item1~item2~item3~etc^person2:item1~item2~item3~etc' 

declare @table1 table (id int, value varchar(500)) 
declare @table2 table (id varchar(50), value varchar(500)) 
declare @table3 table (id varchar(50), value varchar(50)) 

insert @table1 (id, value) select * from fn_ParseDelimitedStrings(@string, '^') 

insert @table2 (id, value) 
    select 
     id = (select f.value from fn_ParseDelimitedStrings(t.value, ':') f where f.RowId=1), 
     value = (select f.value from fn_ParseDelimitedStrings(t.value, ':') f where f.RowId=2) 
    from @table1 t 

select * from @table2 

上面的代碼給我的數據的形式:

id  value 
------------------------------- 
person1 item1~item2~item3~etc 
person2 item1~item2~item3~etc 

但我需要這種形式的數據:

id  value 
------------------------------- 
person1 item1 
person1 item2 
person1 item3 
person1 etc 
person2 item1 
person2 item2 
person2 item3 
person3 etc 

輸入字符串可以有任意數量的「人員」,每個人可以有任意數量的「項目」。

fn_ParseDelimitedStrings是一個自定義函數,我們可以爲每個分隔項返回一個索引 - 值對的表。即:

RowID Value 
------------- 
1  item1 
2  item2 
3  item3 
4  etc 

我無法從最終的拆分每一個「項目」關聯到「人」,他們應當用有關。

有沒有什麼可以做,或者我將不得不使用遊標?

+0

退房這個職位。 。 。 http://stackoverflow.com/questions/697519/split-function-equivalent-in-tsql。如果你關心表現,看看Aaron Bertrand的話。 – 2012-08-08 17:36:29

回答

2

outer apply將加入當前行與派生表裏面找到外的所有行申請:

insert @table2 (id, value) 
select 
    id = (select f.value from fn_ParseDelimitedStrings(t.value, ':') f where f.RowId=1), 
    value = v1.value 
from @table1 t 
outer apply 
(
    select v.value 
    from fn_ParseDelimitedStrings(
     (select f.value 
      from fn_ParseDelimitedStrings(t.value, ':') f 
      where f.RowId=2) 
     , '~') v 
) v1 

*編輯值1到V1,以匹配最外層選擇

+0

工作出色。謝謝! – Shmiddty 2012-08-08 17:38:57