如何通过单个查询更新多个xml节点值

时间:2014-03-25 18:49:21

标签: sql sql-server xml sql-server-2008

考虑xml

<root>
  <parent id="1">
    <child>
      <field name="1">
        <value>abc</value>
      </field>
      <field name="2">
        <value>cdf</value>
      </field>
      <field name="2">
        <value>xyz</value>
      </field>
      <field name="1">
         <value>uvw</value>
      </field>
    </child>
  </parent>
  <parent id="2">
    <child>
      <field name="1">
        <value>123</value>
      </field>
      <field name="3">
        <value>234</value>
      </field>
      <field name="4">
        <value>34</value>
      </field>
      <field name="1">
        <value>544</value>
      </field>
   </child>
 </parent>

我想更新'value'的文本值,其中field node的'name'属性等于'1'

这是我现在拥有的......

update newTable
set xmlcol.modify('replace value of(/root/parent/child/field[@name="1"]/value/text()) with "newValue"')

这适用于所有事件或只是第一个???

2 个答案:

答案 0 :(得分:1)

对于任何为我工作的人.....

BEGIN

declare @I int

;WITH XMLNAMESPACES(DEFAULT 'your namespace')

SELECT @I= xmlcol.value('count(/root/parent/child/field[@name="1"]/value/)', 'int')

FROM newTable

select @I as a

while @I > 0 

  begin

  ;WITH XMLNAMESPACES(DEFAULT 'your namespace')

  update newTable set xmlcol.modify('replace value of (/root/parent/child/field[@name="1"]/value/text()) with "newValue"')

  set @I = @I - 1

end
end

答案 1 :(得分:0)

这仅适用于第一个(第二个或任何@i is)事件。

declare @i int = 1;

update newTable
set xmlcol.modify('replace value of (/root/parent/child/field[@name="1"]/value/text())[{sql:variable("@i")}] with "newValue"');

您应该在循环中用新的值替换所有值。