Dela via


Använda AUTO-läge med FOR XML

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Enligt beskrivningen i FOR XML (SQL Server)returnerar AUTO-läget frågeresultat som kapslade XML-element. Detta ger inte mycket kontroll över formen på DEN XML som genereras från ett frågeresultat. Autolägesfrågor är användbara om du vill generera enkla hierarkier. Men Använd EXPLICIT-läge med FOR XML och Använd PATH-läge med FOR XML ger mer kontroll och flexibilitet när du bestämmer XML-formen från ett frågeresultat.

Varje tabell i FROM-satsen, från vilken minst en kolumn visas i SELECT-satsen, representeras som ett XML-element. Kolumnerna som anges i SELECT-satsen mappas till attribut eller underelement, om det valfria ELEMENT-alternativet anges i FOR XML-satsen.

XML-hierarkin, inbäddningen av elementen, i den resulterande XML baseras på ordningen av tabellerna som identifieras av kolumnerna som anges i SELECT-satsen. Därför är ordningen i vilken kolumnnamn anges i SELECT-satsen betydande. Den första, vänstra tabellen som identifieras utgör det översta elementet i det resulterande XML-dokumentet. Den andra tabellen längst till vänster, identifierad av kolumner i SELECT-instruktionen, bildar ett underelement i det översta elementet och så vidare.

Om ett kolumnnamn som anges i SELECT-satsen kommer från en tabell som redan har identifierats av en tidigare angiven kolumn i SELECT-satsen läggs kolumnen till som ett attribut för det element som redan har skapats, i stället för att öppna en ny hierarkinivå. Om alternativet ELEMENT har angetts läggs kolumnen till som ett attribut.

Kör till exempel den här frågan:

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;

Detta är det partiella resultatet:

<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>
...

Observera följande i SELECT-satsen:

  • CustomerID refererar till tabellen Cust. Därför skapas ett <Cust> element och CustomerID läggs till som dess attribut.

  • Därefter refererar tre kolumner, OrderHeader.CustomerID, OrderHeader.SaleOrderID och OrderHeader.Status, till tabellen OrderHeader. Därför läggs ett <OrderHeader> element till som ett underelement i <Cust>-elementet och de tre kolumnerna läggs till som attribut för <OrderHeader>.

  • Därefter refererar kolumnen Cust.CustomerType igen till tabellen Cust som redan har identifierats av kolumnen Cust.CustomerID. Därför skapas inget nytt element. I stället läggs attributet CustomerType till i det <Cust> element som skapades tidigare.

  • Frågan anger alias för tabellnamnen. Dessa alias visas som motsvarande elementnamn.

  • ORDER BY krävs för att gruppera alla barn under en förälder.

Den här frågan liknar den föregående, förutom att SELECT-satsen anger kolumner i tabellen OrderHeader före kolumnerna i Cust-tabellen. Därför skapas först <OrderHeader>-elementet och sedan läggs det underordnade elementet <Cust> till.

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;

Detta är det partiella resultatet:

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

Om elementalternativet läggs till i FOR XML-satsen returneras elementcentrerad XML.

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

Detta är det partiella resultatet:

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

I den här frågan jämförs CustomerID-värdena från en rad till nästa när du skapar <Cust-> element, eftersom CustomerID är den primära nyckeln i tabellen. Om CustomerID inte identifieras som primärnyckel för tabellen jämförs alla kolumnvärden (CustomerID, CustomerType i den här frågan) från en rad till en annan. Om värdena skiljer sig åt läggs ett nytt <Cust->-element till i XML-koden.

Om någon av de kolumner som ska jämföras är av typen text, ntext, bildeller XML-förutsätter FOR XML att värdena är olika och inte jämförs, även om de kan vara desamma. Det beror på att det inte går att jämföra stora objekt. Element läggs till i resultatet för varje markerad rad. Kolumnerna i (n)varchar(max) och varbinary(max) jämförs.

När en kolumn i SELECT-satsen inte kan associeras med någon av tabellerna som identifieras i FROM-satsen, som när det gäller en aggregerad kolumn eller beräknad kolumn, läggs kolumnen till i XML-dokumentet på den djupaste kapslingsnivån när den påträffas i listan. Om en sådan kolumn visas som den första kolumnen i SELECT-satsen läggs kolumnen till i det översta elementet.

Om jokertecknet asterisk (*) anges i SELECT-satsen bestäms kapslingen på samma sätt som tidigare beskrivits, baserat på ordningen som raderna returneras av frågemotorn.

Nästa steg

Följande artiklar innehåller mer information om AUTO-läge:

Se även