sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan bruger du SQL-variabel til at iterere XML-noder

Din egen kode ville fungere med kun én mere [1] . Funktionen .modify() kan ikke fortolke [sql:variable(...)] ... Dette kan være et hvilket som helst filter, selv et med mere end ét resultat... Så skift bare dette til:

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

Men jeg ville gå en anden vej... Du kan læse hele partiet som afledt tabel og genopbygge XML'en sådan her:

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')

En anden tilgang ville være 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>
')



  1. Hvordan løses MySQL innodb Venter på tabelmetadatalås på TRUNCATE TABLE?

  2. mysql:forbindelse afvist, når du forsøger at oprette forbindelse til localhost ved hjælp af ekstern IP

  3. oracle 12c - vælg streng efter sidste forekomst af et tegn

  4. TILSYNLIGT DEADLOCK Oprettelse af nødtråde til ikke-tildelte afventende opgaver