Mã của riêng bạn sẽ hoạt động chỉ với một [1]
nữa . Hàm .modify()
không thể diễn giải [sql:variable(...)]
... Đây có thể là bất kỳ bộ lọc nào, thậm chí là một bộ lọc có nhiều hơn một kết quả ... Vì vậy, chỉ cần thay đổi bộ lọc này thành:
DECLARE @xml xml = '<Root>
<Contacts>
<Contact name="John Doe" type="REG" other="value" />
<Contact name="Jane Doe" type="REG" other="value" />
<Contact name="Jennifer Doe" type="REG" other="value" />
<Contact name="Jane Doe" type="REG" other="value" />
</Contacts>
</Root>';
DECLARE @i int = 1
SET @xml.modify('replace value of (/Root/Contacts/Contact)[sql:variable("@i")][1]/@type with "NEW"')
SELECT @xml
Nhưng tôi sẽ đi một con đường khác ... Bạn có thể đọc toàn bộ dưới dạng bảng dẫn xuất và xây dựng lại XML như thế này:
SELECT
(
SELECT c.value('@name','nvarchar(max)') AS [@name]
--,c.value('@type','nvarchar(max)') AS [@type]
,'NEW' AS [@type]
,c.value('@other','nvarchar(max)') AS [@other]
FROM @xml.nodes('/Root/Contacts/Contact') AS A(c)
FOR XML PATH('Contact'),ROOT('Contact'),TYPE
)
FOR XML PATH('Root')
Một cách tiếp cận khác sẽ là FLWOR:
SELECT @xml.query('
for $r in /Root/Contacts
return <Root><Contacts>
{
for $c in /Root/Contacts/Contact
return <Contact name="{$c/@name}" type="NEW" other="{$c/@other}"/>
}
</Contacts></Root>
')