我有一个具有多个“父”节点的 XML 值列。我需要在每个父节点中插入一个“子”节点。如果我使用
UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]')
,然后我只将一个子节点插入第一个父节点。
如何通过单个查询在每个父母中插入一个孩子?
我相信最简单的方法是使用 CROSS APPLY 和 FOR XML 使用 SELECT 语句重建 XML。
这是一个例子,希望它有意义。使用这种方法,您还可以将要插入<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>
我结束了向上移动一个级别(即获取所有父节点),计算替换的 XML,并使用“替换值”而不是“插入”