Zoeken…


Opmerkingen

Er zijn ook verschillende andere FOR XML modi:

  • FOR XML RAW - Creëert één <row> -element per rij.
  • FOR XML AUTO - Pogingen om een hiërarchie heuristisch automatisch te genereren.
  • FOR XML EXPLICIT - Biedt meer controle over de vorm van de XML, maar is omslachtiger dan FOR XML PATH .

Hallo wereld XML

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

Naamruimten opgeven

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>

Structuur opgeven met XPath-expressies

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 worden kolommen zonder naam tekstknooppunten. NULL of '' daarom lege tekstknooppunten. Opmerking: u kunt een benoemde kolom converteren naar een naamloze kolom met 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>

Het gebruik van (lege) tekstknooppunten helpt om het vorige uitvoerknooppunt van het volgende te scheiden, zodat SQL Server weet een nieuw element voor de volgende kolom te starten. Anders raakt het in de war wanneer het attribuut al bestaat op wat het denkt dat het "huidige" element is.

Zonder de lege tekenreeksen tussen het element en het kenmerk in de SELECT instructie geeft SQL Server bijvoorbeeld een fout:

Attribuutgerichte kolom 'FLD / @ NAME' mag niet komen na een niet-attribuutgerichte broer of zus in XML-hiërarchie in FOR XML PATH.

Merk ook op dat dit voorbeeld de XML ook verpakte in een root-element genaamd row , gespecificeerd door ROOT('row')

FOR XML PATH gebruiken om waarden samen te voegen

De FOR XML PATH kan worden gebruikt voor het samenvoegen van waarden in tekenreeksen. In het onderstaande voorbeeld worden waarden samengevoegd in een CSV reeks:

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

Enkele belangrijke opmerkingen:

  • de ORDER BY clausule kan worden gebruikt om de waarden op een gewenste manier te ordenen
  • als een langere waarde wordt gebruikt als aaneenscheidingsteken, moet ook de functieparameter STUFF worden gewijzigd;
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
    ,''
);
  • omdat de TYPE optie en .value functie worden gebruikt, werkt de aaneenschakeling met de NVARCHAR(MAX) -reeks


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow