0

カーソルを使用してこれを行うことはできますが、可能な限り回避しようとしています。これが私が行っているサンプルコードのビットです:

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

入力文字列には任意の数の「persons」を含めることができ、各personには任意の数の「items」を含めることができます。

fn_ParseDelimitedStringsは、区切られた各項目のインデックスと値のペアのテーブルを返すカスタム関数です。すなわち:

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

最終分割からの各「アイテム」を、それらを関連付ける必要のある「人」に関連付けるのに問題があります。

できることはありますか、それともカーソルを使用する必要がありますか?

4

1 に答える 1

2

アウターアプライは、現在の行をアウターアプライ内の派生テーブルにあるすべての行と結合します。

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に編集して、最も外側の選択に一致させます

于 2012-08-08T17:33:09.870 に答える