Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak używać zmiennej SQL do iterowania węzłów XML

Twój własny kod będzie działał z jeszcze jednym [1] . Funkcja .modify() nie może zinterpretować [sql:variable(...)] ... Może to być dowolny filtr, nawet taki z więcej niż jednym wynikiem... Więc po prostu zmień to na:

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

Ale poszedłbym inną ścieżką... Możesz przeczytać całość jako tabelę pochodną i przebudować XML w ten sposób:

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

Innym podejściem byłoby 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób na skopiowanie bazy danych?

  2. Czy T-SQL ma funkcję agregującą do łączenia ciągów?

  3. Zakleszczenie podczas SELECT/UPDATE

  4. Błąd podczas konwertowania typów danych podczas importowania z programu Excel do programu SQL Server 2008

  5. Audyt danych w NHibernate i SqlServer