1

私は2つのテーブルを持っています。1つのテーブルはキー列とxml列を保持します。他のテーブルはデータを保持します。2番目のテーブルからxmlを作成し、最初のテーブルを更新しようとすると。1つのノードのみを更新し、2番目のノードを無視します。この例を参照してください。

    declare @mytable table
    (
    col1 int,
    col2 varchar(100)
    )
    declare @mytable1 table
    (
    col1 int,
    col2 xml
    )
    insert into @mytable1 values(1,null)
    insert into @mytable1 values(2,null)

    insert into @mytable values(1,'abc')
    insert into @mytable values(1,'dcf')
    insert into @mytable values(2,'efg')
    insert into @mytable values(2,'hhh')

    update x set col2=  d.XMLCol from @mytable1 x
    inner join
    (select a.col1,  node.XMLCol from @mytable a join @mytable1 b on a.col1=b.col1 cross apply (select a.col1,a.col2 for xml path('record') , root ('myroot'), type
    ) as node(XMLCol)  )d
    on x.col1=x.col1

    select * from @mytable1

実際の結果は

1   <myroot><record><col1>1</col1><col2>abc</col2></record></myroot>
2   <myroot><record><col1>2</col1><col2>hhh</col2></record></myroot>

期待される結果は

1   <myroot><record><col1>1</col1><col2>abc</col2></record><record><col1>1</col1><col2>dcf</col2></record></myroot>
2   <myroot><record><col1>2</col1><col2>hhh</col2></record><record><col1>2</col1><col2>efg</col2></record></myroot>

誰かが私が間違っていることを指摘できますか?

ありがとう、

エセン。

4

1 に答える 1

1

誰かが私が間違っていることを指摘できますか?

  1. @mytable1デカルト積を生成する同じ列に自己結合しています。on x.col1=x.col1.
  2. 派生テーブルは、 の各行に対して 2 つの行を返します@mytable1。最初のノードを含む最初の行と、2 番目のノードを含む 2 番目の行。update ステートメントは、これらの行を 1 つに結合するのではなく、そのうちの 1 つを選択します。

代わりに次のようにします。

update x set 
  col2 = (
          select a.col1,
                 a.col2
          from @mytable as a
          where x.col1 = a.col1
          for xml path('record'), root('myroot'), type
         )
from @mytable1 x

SEデータ

于 2012-06-18T13:22:05.017 に答える