【问题标题】:how to update multiple xml node values through a single query如何通过单个查询更新多个 xml 节点值
【发布时间】:2014-03-25 18:49:20
【问题描述】:

考虑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'的文本值,其中字段节点的'name'属性等于'1'

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

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

这适用于所有事件还是仅适用于第一个事件???

【问题讨论】:

  • 你试过测试吗?
  • 我之前在做,但现在无法得到结果,我正在运行,所以不能马上测试它

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


【解决方案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

【讨论】:

    【解决方案2】:

    这仅适用于第一次(第二次或任何@i)出现。

    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"');
    

    您应该在循环中将所有值替换为新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 2020-09-24
      • 2013-03-30
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      相关资源
      最近更新 更多