Несколько узловых вставок для столбца XML в TSQL - PullRequest
0 голосов
/ 23 марта 2012

У меня есть столбец со значением XML, который имеет несколько «родительских» узлов.Мне нужно вставить «дочерний» узел в каждый родительский узел.Если я использую

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

, то я вставляю дочерний узел только в первого родителя.

Как вставить ребенка в каждого родителя с помощью одного запроса?

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Я закончил движение на один уровень вверх (то есть взял все родительские узлы), вычислил замененный XML и использовал «replace value of» вместо «insert»

0 голосов
/ 23 марта 2012

Я считаю, что самый простой способ сделать это - восстановить XML с помощью оператора SELECT с использованием CROSS APPLY и FOR 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>
...