Như có câu nói, "Ở đâu có ý chí, ở đó có cách"
Đây là hai phương pháp: đầu tiên là chỉ cần thay thế xml trước đó bằng một xml mới được xây dựng từ bản gốc với tên phần tử mới. Trong ví dụ của tôi, tôi đã thay đổi Chân / Chân thành Limbs / Limb, điều này có thể rất phức tạp đối với bất kỳ thứ gì ngoại trừ giản đồ đơn giản nhất
Và thứ hai, một cách tiếp cận thích hợp hơn là kết hợp chèn và xóa.
Tôi đã kết hợp chúng thành một ví dụ đơn giản:
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;