Delen via


Automodus gebruiken met FOR XML

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Zoals beschreven in FOR XML (SQL Server), retourneert de AUTO-modus queryresultaten als geneste XML-elementen. Dit biedt niet veel controle over de vorm van de XML die is gegenereerd op basis van een queryresultaat. De queries in de automodus zijn handig als u eenvoudige hiërarchieën wilt genereren. Echter, de EXPRESS modus gebruiken met FOR XML en de PATH modus gebruiken met FOR XML biedt meer controle en flexibiliteit bij het bepalen van de vorm van de XML op basis van een queryresultaat.

Elke tabel in de FROM-component, waaruit ten minste één kolom wordt vermeld in de SELECT-component, wordt weergegeven als een XML-element. De kolommen die in de SELECT-component worden vermeld, worden toegewezen aan kenmerken of subelementen als de optionele optie ELEMENTS is opgegeven in de FOR XML-component.

De XML-hiërarchie, het nesten van de elementen, in de resulterende XML is gebaseerd op de volgorde van tabellen die worden geïdentificeerd door de kolommen die zijn opgegeven in de SELECT-component. Daarom is de volgorde waarin kolomnamen worden opgegeven in de SELECT-component aanzienlijk. De eerste, meest linkse tabel die wordt geïdentificeerd, vormt het bovenste element in het resulterende XML-document. De tweede meest linkse tabel, geïdentificeerd door kolommen in de SELECT-instructie, vormt een subelement binnen het bovenste element, enzovoort.

Als een kolomnaam die wordt vermeld in de SELECT-component afkomstig is van een tabel die al is geïdentificeerd door een eerder opgegeven kolom in de SELECT-component, wordt de kolom toegevoegd als een kenmerk van het element dat al is gemaakt, in plaats van een nieuw niveau van de hiërarchie te openen. Als de optie ELEMENTS is opgegeven, wordt de kolom toegevoegd als een kenmerk.

Voer bijvoorbeeld deze query uit:

SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status,
       Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO;

Dit is het gedeeltelijke resultaat:

<Cust CustomerID="1" CustomerType="S">
  <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />
  <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />
  <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />
  <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />
</Cust>
...

Let op het volgende in de SELECT-component:

  • De CustomerID verwijst naar de tabel Cust. Daarom wordt een <Cust>-element gemaakt en wordt CustomerID toegevoegd als kenmerk.

  • Hierna verwijzen drie kolommen, OrderHeader.CustomerID, OrderHeader.SaleOrderID en OrderHeader.Status naar de tabel OrderHeader. Daarom wordt een <OrderHeader>-element toegevoegd als subelement van het <Cust>-element en worden de drie kolommen toegevoegd als kenmerken van <OrderHeader>.

  • Vervolgens verwijst de kolom Cust.CustomerType opnieuw naar de Cust-tabel die al is geïdentificeerd door de kolom Cust.CustomerID. Daarom wordt er geen nieuw element gemaakt. In plaats daarvan wordt het kenmerk CustomerType toegevoegd aan het <Cust>-element dat eerder is gemaakt.

  • Met de query worden aliassen voor de tabelnamen opgegeven. Deze aliassen worden weergegeven als overeenkomende elementnamen.

  • ORDER BY is vereist om alle kinderen onder één ouder te groeperen.

Deze query is vergelijkbaar met de vorige, behalve de SELECT-component bevat kolommen in de tabel OrderHeader vóór de kolommen in de Cust-tabel. Eerst wordt het <OrderHeader>-element gemaakt en vervolgens wordt het kindelement <Cust> eraan toegevoegd.

select OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status,
       Cust.CustomerID,
       Cust.CustomerType
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
where Cust.CustomerID = OrderHeader.CustomerID
for xml auto;

Dit is het gedeeltelijke resultaat:

<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
  <Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...

Als de optie ELEMENTS wordt toegevoegd in de FOR XML clausule, wordt elementgerichte XML geretourneerd.

SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status,
       Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS

Dit is het gedeeltelijke resultaat:

<Cust>
  <CustomerID>1</CustomerID>
  <CustomerType>S</CustomerType>
  <OrderHeader>
    <CustomerID>1</CustomerID>
    <SalesOrderID>43860</SalesOrderID>
    <Status>5</Status>
  </OrderHeader>
   ...
</Cust>
...

In deze query worden de customerID-waarden vergeleken van de ene rij naar de volgende bij het maken van de <Cust->-elementen, omdat CustomerID de primaire sleutel van de tabel is. Als CustomerID niet wordt geïdentificeerd als de primaire sleutel voor de tabel, worden alle kolomwaarden (CustomerID, CustomerType in deze query) vergeleken van de ene rij naar de volgende. Als de waarden verschillen, wordt een nieuw <Cust->-element toegevoegd aan de XML.

Bij het vergelijken van deze kolomwaarden, als een van de kolommen die moeten worden vergeleken, van het type tekst, ntext, afbeeldingof XML-, wordt in FOR XML ervan uitgegaan dat de waarden verschillen en niet worden vergeleken, ook al zijn ze mogelijk hetzelfde. Dit komt doordat het vergelijken van grote objecten niet wordt ondersteund. Elementen worden toegevoegd aan het resultaat voor elke geselecteerde rij. Kolommen (n)varchar(max) en varbinary(max) worden met elkaar vergeleken.

Wanneer een kolom in de SELECT-component niet kan worden gekoppeld aan een van de tabellen die zijn geïdentificeerd in de FROM-component, zoals in het geval van een geaggregeerde kolom of berekende kolom, wordt de kolom toegevoegd in het XML-document op het diepste nestniveau wanneer deze in de lijst wordt aangetroffen. Als een dergelijke kolom wordt weergegeven als de eerste kolom in de SELECT-component, wordt de kolom toegevoegd aan het bovenste element.

Als het jokerteken (*) is opgegeven in de SELECT-clausule, wordt de structuur op dezelfde manier bepaald als eerder beschreven, op basis van de volgorde waarin de rijen door de query-engine worden geretourneerd.

Volgende stappen

In de volgende artikelen vindt u meer informatie over de automodus:

Zie ook