sql >> Database >  >> RDS >> Sqlserver

Hoe de SQL-variabele te gebruiken om XML-knooppunten te herhalen

Je eigen code zou werken met nog een [1] . De functie .modify() kan de [sql:variable(...)] niet interpreteren ... Dit kan elk filter zijn, zelfs een met meer dan één resultaat... Dus verander dit gewoon in:

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

Maar ik zou een andere weg inslaan... Je zou het hele stuk als afgeleide tabel kunnen lezen en de XML als volgt kunnen herbouwen:

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

Een andere benadering zou FLWOR zijn:

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. Geef WAAR parameters door aan PostgreSQL View?

  2. Automatische verhoging toevoegen aan bestaande kolom zonder de huidige recordwaarden te beïnvloeden

  3. Zet de tabel neer, kan de tabel met dezelfde naam dan niet opnieuw maken

  4. Overeenkomsten en verschillen tussen RANK-, DENSE_RANK- en ROW_NUMBER-functies