Microsoft SQL Server
VOOR XML PATH
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 danFOR XML PATH
.
Hallo wereld XML
SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>
Naamruimten opgeven
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 deNVARCHAR(MAX)
-reeks