Wie das Sprichwort sagt, "Wo ein Wille ist, ist auch ein Weg"
Hier sind zwei Methoden: Die erste besteht darin, einfach die vorherige XML-Datei durch eine neue XML-Datei zu ersetzen, die aus dem Original mit dem neuen Elementnamen erstellt wurde. In meinem Beispiel habe ich Legs/Leg in Limbs/Limb geändert, dies könnte für alles andere als das einfachste Schema sehr kompliziert werden
Und zweitens ein geeigneterer Ansatz, Insert und Delete zu kombinieren.
Ich habe sie in einem einfachen Beispiel kombiniert:
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;