2014-01-28 2 views
0

Я пытаюсь обновить столбец XML в таблице SQL Server с помощьюКак изменить атрибут XML в XML-поле таблицы Sql сервера

XML.modify replace value of (XML DML) 

С приведенном ниже примере XML, есть способ я могу заменить все vendorId со значением 1 в другое значение? Из документации в http://technet.microsoft.com/en-us/library/ms190675.aspx, похоже, мне нужно указать индекс записи для этого. Но в моем случае, было бы несколько записей в пределах XML, и я не знаю порядок было бы в.

<LineItems> 
    <LineItem productId="48" invId="1573" quantity="1" id="1" vendorId="1022" price="1350.0000" cost="450.0000" discount="0" acqu="2" /> 
    <LineItem productId="1" invId="0" quantity="1" id="2" vendorId="1" price="400" cost="0" discount="0" /> 
    <LineItem productId="46" invId="1574" quantity="1" id="3" vendorId="1022" price="789.0000" cost="263.0000" discount="0" acqu="4" /> 
    <LineItem productId="1" invId="0" quantity="1" id="4" vendorId="1" price="300" cost="0" discount="0" /> 
</LineItems> 

Пожалуйста, советы.

Спасибо!

ответ

1

Вы должны использовать цикл и обновлять одно значение за раз.

while @XML.exist('/LineItems/LineItem[@vendorId = "1"]') = 1 
    set @XML.modify('replace value of (/LineItems/LineItem[@vendorId = "1"]/@vendorId)[1] with "2"') 

SQL Fiddle

версия, которая обновляет столбец XML в таблице будет выглядеть следующим образом.

while exists(
      select * from T 
      where T.XMLColumn.exist('/LineItems/LineItem[@vendorId = "1"]') = 1 
        --and [some other condition] 
      ) 
begin 
    update T 
    set XMLColumn.modify('replace value of (/LineItems/LineItem[@vendorId = "1"]/@vendorId)[1] with "2"') 
    where T.XMLColumn.exist('/LineItems/LineItem[@vendorId = "1"]') = 1 
     --and [some other condition] 
end 

SQL Fiddle

+0

Как бы я использую это на UPDATE заявление? – Ganesh

+0

@Ganesh Я обновил ответ –

+0

Спасибо, @Mikael. Это отлично сработало для моей ситуации, хотя я не уверен, что это будет оптимизированный подход для частых обновлений. – Ganesh

0

Если вам нужно заменить постоянную строку на другую, я советую вам использовать функцию REPLACE и перфорировать ее на строке.

DECLARE @XML XML /*your xml value*/ 
SELECT REPLACE(CONVERT(NVARCHAR(MAX),@XML),'vendor="1"','"vendor="2"') 

Во многих случаях это намного проще, чем в xml-стиле.