我有一个XML值列,它有多个“父”节点。我需要在每个父节点中插入一个“子”节点。如果我使用
UPDATE mytable SET mycolumn.modify('insert <child/> into (//parent)[1]')
,然后我只将子节点插入第一个父节点。
如何使用单个查询在每个父级中插入子级?
答案 0 :(得分:0)
我认为最简单的方法是使用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>
答案 1 :(得分:0)
我结束了向上移动一级(即占用所有父节点),计算替换的XML,并使用“替换值”而不是“插入”