आपका अपना कोड सिर्फ एक और [1]
. के साथ काम करेगा . फंक्शन .modify()
[sql:variable(...)]
. की व्याख्या नहीं कर सकता ... यह कोई भी फ़िल्टर हो सकता है, यहां तक कि एक से अधिक परिणामों वाला भी... तो बस इसे इसमें बदलें:
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
लेकिन मैं एक और रास्ता अपनाऊंगा ... आप पूरी तरह से व्युत्पन्न तालिका के रूप में पढ़ सकते हैं और एक्सएमएल को इस तरह पुनर्निर्माण कर सकते हैं:
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')
दूसरा तरीका होगा 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>
')