FOR XML (SQL Server)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Een SELECT query retourneert resultaten als een rijenset. U kunt eventueel formele resultaten van een SQL-query ophalen als XML door de FOR XML component in de query op te geven. De FOR XML component kan worden gebruikt in query's op het hoogste niveau en in subquery's. De clausule op het hoogste niveau FOR XML kan alleen in de SELECT statement worden gebruikt. In subquery's kan FOR XML worden gebruikt in de instructies INSERT, UPDATE en DELETE. FOR XML kan ook worden gebruikt in toewijzingsinstructies.

In een FOR XML clausule geeft u een van deze modi op:

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

De RAW modus genereert één <row> element per rij in de rijenset die wordt geretourneerd door de SELECT instructie. U kunt een XML-hiërarchie genereren door geneste FOR XMLquery's te schrijven.

De AUTO modus genereert nesten in de resulterende XML met behulp van heuristiek op basis van de manier waarop de SELECT instructie wordt opgegeven. U hebt minimale controle over de vorm van de gegenereerde XML. De geneste FOR XML query’s kunnen zo worden geschreven dat ze een XML-hiërarchie genereren die verder gaat dan de XML-structuur die wordt gegenereerd door AUTO-modusheuristieken.

De EXPLICIT modus biedt meer controle over de vorm van de XML. U kunt kenmerken en elementen tegelijk combineren bij het bepalen van de vorm van de XML. Hiervoor is een specifieke indeling vereist voor de resulterende rijenset die wordt gegenereerd vanwege de uitvoering van query's. Deze rowsetindeling wordt vervolgens omgezet naar een XML-structuur. De kracht van de modus EXPLICIT is dat u naar wens attributen en elementen kunt combineren, wrappers en geneste complexe eigenschappen kunt maken, door spaties gescheiden waarden kunt maken (het attribuut OrderID kan bijvoorbeeld een lijst met order-ID-waarden bevatten) en gemengde inhoud kunt maken.

Het schrijven van query's voor de modus EXPLICIT kan echter omslachtig zijn. U kunt enkele van de nieuwe mogelijkheden van FOR XML gebruiken, zoals het schrijven van geneste query's in de modus FOR XML RAW, AUTO of PATH en de TYPE-instructie, in plaats van de modus EXPLICIT te gebruiken om de hiërarchieën te genereren. De geneste FOR XML query's kunnen elke XML produceren die u kunt genereren met behulp van de EXPLICIT modus. Zie Geneste FOR XML-query's gebruiken en de instructie TYPE in FOR XML-query's voor meer informatie.

De PATH modus samen met de geneste FOR XML queryfunctie biedt de flexibiliteit van de EXPLICIT modus op een eenvoudigere manier.

Deze modi zijn alleen van kracht voor de uitvoering van de query waarvoor ze zijn ingesteld. Ze hebben geen invloed op de resultaten van eventuele volgende query's.

FOR XML is niet geldig voor een selectie die wordt gebruikt met een FOR BROWSE component.

Voorbeelden

Met de volgende SELECT instructie worden gegevens opgehaald uit de Sales.Customer en Sales.SalesOrderHeader tabellen in de AdventureWorks2025 database. Met deze query geeft u de AUTO modus in de FOR XML component op:

USE AdventureWorks2022;
GO

SELECT Cust.CustomerID,
    OrderHeader.CustomerID,
    OrderHeader.SalesOrderID,
    OrderHeader.STATUS
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
    ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

De FOR XML-clausule en servernamen

Wanneer een SELECT instructie met een FOR XML component een vierdelige naam in de query opgeeft, wordt de servernaam niet geretourneerd in het resulterende XML-document wanneer de query wordt uitgevoerd op de lokale computer. De servernaam wordt echter geretourneerd als de vierdelige naam wanneer de query wordt uitgevoerd op een netwerkserver.

Denk bijvoorbeeld aan deze query:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person
FOR XML AUTO;

Lokale server: Wanneer ServerName is een lokale server, retourneert de query de volgende tekst:

<AdventureWorks2022.Person.Person LastName="Achong" />

Netwerkserver: Wanneer ServerName is een netwerkserver, retourneert de query de volgende tekst:

<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />

Dubbelzinnigheid voorkomen: deze mogelijke dubbelzinnigheid kan worden vermeden door deze alias op te geven:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person x
FOR XML AUTO;

De ondubbelzinnige query retourneert nu de volgende tekst:

<x LastName="Achong"/>