Använda AUTO-läge med FOR XML
gäller för:SQL Server
Azure SQL Database
Azure 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: