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 als FOR XML PATH .

Hallo Welt XML

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

Namespaces angeben

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>

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 Option TYPE und .value Funktion .value verwendet werden, funktioniert die Verkettung mit der NVARCHAR(MAX)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow