Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008:Umbenennen eines Elements mithilfe von XML-DML?

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;