複数の「親」ノードを持つ XML 値の列があります。各親ノードに「子」ノードを挿入する必要があります。私が使用する場合
UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]')
、次に子ノードを最初の親のみに挿入しています。
単一のクエリですべての親に子を挿入するにはどうすればよいですか?
1つ上のレベルに移動し(つまり、すべての親ノードを取得し)、置き換えられたXMLを計算し、「挿入」の代わりに「の値を置き換え」を使用しました。
これを実現する最も簡単な方法は、CROSS APPLY と FOR XML を使用して SELECT ステートメントで XML を再構築することだと思います。
ここに例があります。それが理にかなっていることを願っています。このアプローチでは、ノードに挿入するデータの別のテーブルに JOIN することもでき、<child2 />このソリューションは非常に柔軟になります。
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>