Ricerca…


Osservazioni

Esistono anche diverse altre modalità FOR XML :

  • FOR XML RAW : crea un elemento <row> per riga.
  • FOR XML AUTO - Tenta di autorizzare euristicamente una gerarchia.
  • FOR XML EXPLICIT : fornisce un maggiore controllo sulla forma dell'XML, ma è più ingombrante di FOR XML PATH .

Ciao World XML

SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>

Specifica degli spazi dei nomi

SQL Server 2008
WITH XMLNAMESPACES (
    DEFAULT 'http://www.w3.org/2000/svg',
    'http://www.w3.org/1999/xlink' AS xlink
)
SELECT 
    'example.jpg' AS 'image/@xlink:href',
    '50px' AS 'image/@width',
    '50px' AS 'image/@height'
FOR XML PATH('svg')
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
    <image xlink:href="firefox.jpg" width="50px" height="50px"/>
</svg>

Specifica della struttura usando le espressioni XPath

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

Utilizzo di FOR XML PATH per concatenare i valori

Il FOR XML PATH può essere utilizzato per concatenare i valori in stringa. L'esempio seguente concatena i valori in una stringa CSV :

DECLARE @DataSource TABLE
(
    [rowID] TINYINT
   ,[FirstName] NVARCHAR(32)
);

INSERT INTO @DataSource ([rowID], [FirstName])
VALUES (1, 'Alex')
      ,(2, 'Peter')
      ,(3, 'Alexsandyr')
      ,(4, 'George');

SELECT STUFF
(
    (
        SELECT ',' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
);

Poche note importanti:

  • la clausola ORDER BY può essere utilizzata per ordinare i valori in un modo preferito
  • se si utilizza un valore più lungo come separatore della concatenazione, anche il parametro della funzione STUFF deve essere modificato;
SELECT STUFF
(
    (
        SELECT '---' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,3 -- the "3" could also be represented as: LEN('---') for clarity
    ,''
);
  • come l'opzione TYPE e la funzione .value vengono utilizzate, la concatenazione funziona con la stringa NVARCHAR(MAX)


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow