Microsoft SQL Server
FÜR XML-PFAD
Suche…
Bemerkungen
Es gibt auch mehrere andere FOR XML
Modi:
-
FOR XML RAW
- Erzeugt pro Zeile ein<row>
-Element. -
FOR XML AUTO
- Versucht, automatisch eine Hierarchie zu erstellen. -
FOR XML EXPLICIT
- Bietet mehr Kontrolle über die Form von XML, ist jedoch umständlicher alsFOR XML PATH
.
Hallo Welt XML
SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>
Namespaces angeben
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>
Struktur mit XPath-Ausdrücken angeben
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
werden Spalten ohne Namen zu Textknoten. NULL
oder ''
daher zu leeren Textknoten. Hinweis: Sie können eine benannte Spalte mithilfe von AS *
in eine unbenannte Spalte konvertieren.
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>
Die Verwendung von (leeren) Textknoten hilft, den vorherigen Ausgabeknoten vom nächsten zu trennen, sodass SQL Server weiß, dass ein neues Element für die nächste Spalte gestartet werden muss. Andernfalls wird es verwirrt, wenn das Attribut für das Element "current" bereits vorhanden ist.
Ohne die leeren Zeichenfolgen zwischen dem Element und dem Attribut in der SELECT
Anweisung gibt SQL Server beispielsweise einen Fehler aus:
Die Attribut-zentrierte Spalte 'FLD / @ NAME' darf nicht nach einem nicht-Attribut-zentrischen Geschwister in XML-Hierarchie in FOR XML PATH stehen.
Beachten Sie auch, dass dieses Beispiel die XML-Datei auch in ein Wurzelelement namens row
, das durch ROOT('row')
Verwenden von FOR XML PATH zum Verketten von Werten
Der FOR XML PATH
kann zum Verketten von Werten in Zeichenfolgen verwendet werden. Das folgende Beispiel verkettet Werte in einer CSV
Zeichenfolge:
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
,''
);
Einige wichtige Hinweise:
- Die
ORDER BY
Klausel kann verwendet werden, um die Werte auf eine bevorzugte Weise zu sortieren - Wenn ein längerer Wert als Verkettungstrennzeichen verwendet wird, muss auch der Funktionsparameter
STUFF
geändert werden.
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
,''
);
-
.value
die OptionTYPE
und.value
Funktion.value
verwendet werden, funktioniert die Verkettung mit derNVARCHAR(MAX)