Microsoft SQL Server Specifica della struttura usando le espressioni XPath


Esempio

SELECT
    'XPath example' AS 'head/title',
    'This example demonstrates ' AS 'body/p',
    'https://www.w3.org/TR/xpath/' AS 'body/p/a/@href',
    'XPath expressions' AS 'body/p/a'
FOR XML PATH('html')
<html>
    <head>
        <title>XPath example</title>
    </head>
    <body>
        <p>This example demonstrates <a href="https://www.w3.org/TR/xpath/">XPath expressions</a></p>
    </body>
</html>

In FOR XML PATH , le colonne senza un nome diventano nodi di testo. NULL o '' diventano quindi nodi di testo vuoti. Nota: puoi convertire una colonna con nome in una senza nome usando AS *

DECLARE @tempTable TABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO @tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)

SELECT ROW_NUMBER() OVER (ORDER BY Ref) AS '@NUM',
     'REF' AS 'FLD/@NAME', REF AS 'FLD', '',
     'DES' AS 'FLD/@NAME', DES AS 'FLD', '',
     'QTY' AS 'FLD/@NAME', QTY AS 'FLD'
FROM @tempTable 
FOR XML PATH('LIN'), ROOT('row')
<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">Foobar</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="3">
    <FLD NAME="REF">100003</FLD>
    <FLD NAME="DES">Hello World</FLD>
    <FLD NAME="QTY">2</FLD>
  </LIN>
</row>

L'utilizzo di nodi di testo (vuoti) aiuta a separare il nodo di output precedente da quello successivo, in modo che SQL Server sappia iniziare un nuovo elemento per la colonna successiva. Altrimenti, viene confuso quando l'attributo esiste già su quello che pensa sia l'elemento "corrente".

Ad esempio, senza le stringhe vuote tra l'elemento e l'attributo SELECT , SQL Server restituisce un errore:

La colonna "FLD / @ NAME" centrata sugli attributi non deve venire dopo un fratello non attributo-centrico nella gerarchia XML in PERCORSO FOR XML.

Si noti inoltre che questo esempio ha anche avvolto l'XML in un elemento radice chiamato row , specificato da ROOT('row')