Microsoft SQL Server
FÖR XML-PATH
Sök…
Anmärkningar
Det finns också flera andra FOR XML
lägen:
-
FOR XML RAW
- Skapar ett<row>
-element per rad. -
FOR XML AUTO
- Försök att heuristiskt autogenerera en hierarki. -
FOR XML EXPLICIT
- Ger mer kontroll över XML-formen, men är mer besvärlig änFOR XML PATH
.
Hej World XML
SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>
Ange namnutrymmen
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>
Ange struktur med hjälp av XPath-uttryck
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>
I FOR XML PATH
blir kolumner utan namn textnoder. NULL
eller ''
därför tomma textnoder. Obs! Du kan konvertera en namngivna kolumn till en icke namngiven med hjälp av 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>
Att använda (tomma) textnoder hjälper till att separera den tidigare utgångsnoden från den nästa, så att SQL Server vet att starta ett nytt element för nästa kolumn. Annars blir det förvirrat när attributet redan finns på vad det tycker är det "aktuella" elementet.
Till exempel, utan de tomma strängarna mellan elementet och attributet i SELECT
satset, ger SQL Server ett fel:
Attributcentrisk kolumn 'FLD / @ NAME' får inte komma efter ett icke-attributcentriskt syskon i XML-hierarki i FOR XML PATH.
Observera också att detta exempel också lindade XML i ett rotelement med namnet row
, specificerat av ROOT('row')
Använd FÖR XML PATH för att sammanfoga värden
FOR XML PATH
kan användas för att sammanfoga värden i sträng. Exemplet nedan sammanlänker värden i en CSV
sträng:
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
,''
);
Några viktiga anteckningar:
-
ORDER BY
klausulen kan användas för att beställa värden på ett föredraget sätt - om ett längre värde används som sammanslutningsseparatorn måste
STUFF
funktionsparametern också ändras;
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
,''
);
- när
TYPE
alternativet och.value
används fungerar sammankopplingen medNVARCHAR(MAX)