2014-03-25 21 views
0

考慮XML更新多個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> 

我想更新「值」,其中現場節點的name屬性等於文本值「1」

這裏是我現在所擁有的....

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

將這項工作對所有發生或只是第一個?

+1

你嘗試測試它? –

+0

我早些時候做的,但現在無法得到結果我在跑步,所以不能馬上測試它 – goldsmit409

回答

0

這隻適用於第一個(第二個或任何@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"'); 

您應該用循環中的新值替換所有值。

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