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

Hej World XML

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

Ange namnutrymmen

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>

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 med NVARCHAR(MAX)


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow