Seperti kata pepatah, "Dimana ada kemauan di situ ada jalan"
Berikut dua metodenya: yang pertama adalah mengganti xml sebelumnya dengan xml baru yang dibuat dari aslinya dengan nama elemen baru. Dalam contoh saya, saya telah mengubah Legs/Leg menjadi Limbs/Limb ini bisa menjadi sangat rumit untuk apa pun kecuali skema paling sederhana
Dan kedua, pendekatan yang lebih tepat untuk menggabungkan insert dan delete.
Saya telah menggabungkannya menjadi satu contoh sederhana:
declare @xml as xml = '<animal species="Mouse">
<legs>
<leg>Front Right</leg>
<leg>Front Left</leg>
<leg>Back Right</leg>
<leg>Back Left</leg>
</legs>
</animal>'
set @xml = (select
t.c.value('@species', 'varchar(max)') as '@species'
,(select
ti.C.value('.', 'varchar(max)')
from @Xml.nodes('//animal/legs/leg') ti(c) for xml path('limb'), /* root('limb'), */type) as limbs
from @xml.nodes('//*:animal') t(c) for xml path('animal'), type)
select @xml;
while (@xml.exist('/animal/limbs/limb') = 1) begin
/*insert..*/
set @xml.modify('
insert <leg>{/animal/limbs/limb[1]/text()}</leg>
before (/animal/limbs/limb)[1]
');
/*delete..*/
set @xml.modify('delete (/animal/limbs/limb)[1]');
end
set @xml.modify('
insert <legs>{/animal/limbs/leg}</legs>
before (/animal/limbs)[1]
');
set @xml.modify('delete (/animal/limbs)[1]');
select @xml;