2012-03-23 12 views
0

XML値の列に複数の「親」ノードがあります。私は各親ノードに "子"ノードを挿入する必要があります。私が使用している場合TSQLのXML列に対する複数のノードの挿入

UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]') 

の場合、最初の親ノードに子ノードを挿入します。

単一のクエリですべての親に子を挿入するにはどうすればよいですか?

答えて

0

これを達成する最も簡単な方法は、CROSS APPLYとFOR XMLを使用してSELECT文を使用してXMLを再構築することです。

ここは例です。意味があると思います。この方法では、<child2 />ノードに挿入するデータの別のテーブルにJOINして、このソリューションを非常に柔軟にすることもできます。私は1つのレベルアップを動かす終了

DECLARE @t TABLE (Document XML) 
INSERT INTO @t 
SELECT '<root><parent><child1>first row data</child1></parent><parent><child1>second row data</child1></parent></root>' 

SELECT 
    ref.value('child1[1]', 'varchar(max)') as child1, 
    'something to insert' as child2 
FROM @t CROSS APPLY Document.nodes('//parent') R(ref) 
FOR XML PATH('parent'), ROOT('root') 

結果

<root> 
    <parent> 
    <child1>first row data</child1> 
    <child2>something to insert</child2> 
    </parent> 
    <parent> 
    <child1>second row data</child1> 
    <child2>something to insert</child2> 
    </parent> 
</root> 
+0

@ulu - 私は今日後で時間があるときにクロス適用の例を投稿しようとしますが、この記事をチェックしてください。http://social.msdn.microsoft.com/Forums/en-US/sqlxml/スレッド/ 4d0cd921-eab9-4b3e-b210-52b6ee65f6c1/ –

+0

答えをありがとうが、私はもっと複雑なものが必要です。同様の子ノードの後に​​子ノードを追加する必要があるため、置換は機能しません。あなたの十字架の例を見るのは素晴らしいことでしょう。 – ulu

+0

@ulu - 遅れて返答して申し訳ありませんが、多くのことが続いていました。私はCROSS APPYとFOR XMLを使って 'insert'を実行し、基本的には新しいノードでXMLを再構築するように私のソリューションを更新しました。 –

0

、(つまり、すべての親ノードを取る)に置き換えXMLを計算し、代わりに「挿入」の「の値を置き換える」を使用して

関連する問題