Microsoft SQL Server
PER IL PERCORSO XML
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 diFOR XML PATH
.
Ciao World XML
SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>
Specifica degli spazi dei nomi
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 stringaNVARCHAR(MAX)