SQL XML Замена элементов - PullRequest
1 голос
/ 31 марта 2012

Пожалуйста, помогите! Можно ли заменить элементы в поле xml базы данных sql другими элементами. Я пытался использовать .modify (заменить значение), но я могу заменить только текст внутри элементов, а не узлов.

В конечном итоге я пытаюсь обновить элемент, который может содержать или не содержать другие элементы, с помощью другого элемента (возможно, с тем же именем) в поле XML. (Я использую SQL Server 2008)

например:

<Root>
  <Sub>
    <Value1>
    </Value1>
    <Value2>
    </Value2>
    <Value3>
    </Value3>
  </Sub>
</Root>

Будет заменено на:

<Root>
  <SubVERSION2>
    <Value1>
    </Value1>
    <Value2>
    </Value2>
    <Value3>
    </Value3>
  </SubVERSION2>
</Root>

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 31 марта 2012
declare @T table(XMLCol xml)

insert into @T values ('
<Root>
  <Sub>
    <Value1></Value1>
    <Value2></Value2>
    <Value3></Value3>
  </Sub>
</Root>')

update @T set
  XMLCol = XMLCol.query('for $s in Root/Sub
                         return
                           <Root>
                             <SubVERSION2>
                               { $s/* }
                             </SubVERSION2>
                           </Root>')

Результат:

<Root>
  <SubVERSION2>
    <Value1 />
    <Value2 />
    <Value3 />
  </SubVERSION2>
</Root>
0 голосов
/ 31 марта 2012

Вы можете воссоздать свой XML:

declare @x xml = '<Root>
  <Sub>
    <Value1>1
    </Value1>
    <Value2>2
    </Value2>
    <Value3>3
    </Value3>
  </Sub>
</Root>'

select cast(('<Root>' +
    cast(
    (
        select t.c.query('.')
        from @x.nodes('Root/Sub/*') t(c)
        for xml path(''), root('SubVERSION2')
    ) as nvarchar(max)) + '</Root>') as xml)

производит желаемый вывод:

<Root>
  <SubVERSION2>
    <Value1>1
    </Value1>
    <Value2>2
    </Value2>
    <Value3>3
    </Value3>
  </SubVERSION2>
</Root>
...