Megosztás a következőn keresztül:


AUTO mód használata az FOR XML esetében

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Felügyelt Példány

Amint azt a(z) FOR XML (SQL Server)leírja, az AUTO mód a lekérdezési eredményeket beágyazott XML-elemekként adja vissza. Ez nem biztosít sok ellenőrzést a lekérdezési eredményből létrehozott XML-alakzat felett. Az AUTO módú lekérdezések akkor hasznosak, ha egyszerű hierarchiákat szeretne létrehozni. Azonban az EXPLICIT mód használata a FOR XML-lel és a PATH mód használata a FOR XML-lel nagyobb ellenőrzést és rugalmasságot biztosít az XML lekérdezési eredményből való alakításához.

A FROM záradék minden táblája, amelyből legalább egy oszlop szerepel a SELECT záradékban, XML-elemként jelenik meg. A SELECT záradékban felsorolt oszlopok attribútumokra vagy alelemekre vannak leképezve, ha az opcionális ELEMENTS beállítás meg van adva a FOR XML záradékban.

Az xml-hierarchia, az elemek beágyazása az eredményként kapott XML-ben a SELECT záradékban megadott oszlopok által meghatározott táblák sorrendjén alapul. Ezért jelentős az a sorrend, amelyben az oszlopnevek meg vannak adva a SELECT záradékban. Az első, bal szélső, azonosított tábla képezi az eredményül kapott XML-dokumentum legfelső elemét. A SELECT utasítás oszlopai által azonosított második bal szélső tábla a felső elemen belül alelmezést képez, és így tovább.

Ha a SELECT záradékban felsorolt oszlopnév olyan táblából származik, amelyet a SELECT záradék egy korábban megadott oszlopa már azonosított, az oszlop a már létrehozott elem attribútumaként lesz hozzáadva, ahelyett, hogy új hierarchiaszintet nyit meg. Ha az ELEMENTS beállítás meg van adva, az oszlop attribútumként lesz hozzáadva.

Hajtsa végre például ezt a lekérdezést:

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;

Ez a részleges eredmény:

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

Jegyezze fel a következőket a SELECT záradékban:

  • A CustomerID a Cust táblára hivatkozik. Ezért létrejön egy <Cust> elem, és a CustomerID hozzá lesz adva attribútumként.

  • Ezután három oszlop, az OrderHeader.CustomerID, az OrderHeader.SaleOrderID és az OrderHeader.Status hivatkozás hivatkozik az OrderHeader táblára. Ezért egy <OrderHeader> elemet ad hozzá a <Cust> elem alelemeként, a három oszlop pedig a <OrderHeader>attribútumaként lesz hozzáadva.

  • Ezután a Cust.CustomerType oszlop ismét a Cust.CustomerID oszlop által már azonosított Cust táblára hivatkozik. Ezért nem jön létre új elem. Ehelyett a CustomerType attribútum hozzáadódik a korábban létrehozott <Cust> elemhez.

  • A lekérdezés a táblanevek aliasait adja meg. Ezek az aliasok megfelelő elemnevekként jelennek meg.

  • Az ORDER BY az összes gyermek egy szülő alatti csoportosításához szükséges.

Ez a lekérdezés hasonló az előzőhöz, kivéve, hogy a SELECT záradék az OrderHeader tábla oszlopait adja meg a Cust tábla oszlopai előtt. Ezért először <OrderHeader> elem jön létre, majd hozzá lesz adva a <Cust> gyermekelem.

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;

Ez a részleges eredmény:

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

Ha az ELEMENTS lehetőséget hozzáadja az XML-záradékhoz, a rendszer elemközpontú XML-t ad vissza.

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

Ez a részleges eredmény:

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

Ebben a lekérdezésben a CustomerID értékek egy sorból a következőbe kerülnek a <Cust> elemeinek létrehozásakor, mivel a CustomerID a tábla elsődleges kulcsa. Ha a CustomerID nem a tábla elsődleges kulcsa, a rendszer az összes oszlopértéket (CustomerID, CustomerType ebben a lekérdezésben) egy sorból a következőbe hasonlítja. Ha az értékek eltérnek, a rendszer hozzáad egy új <Cust> elemet az XML-hez.

Amikor összehasonlítjuk ezeket az oszlopértékeket, ha az összehasonlítandó oszlopok közül bármelyik típusú szöveg, ntext, képvagy xml, az XML úgy véli, hogy ezek az értékek különböznek, és ezért nem hasonlítja össze őket, még akkor is, ha valójában azonosak lehetnek. Ennek az az oka, hogy a nagyméretű objektumok összehasonlítása nem támogatott. A rendszer elemeket ad hozzá az eredményhez minden kijelölt sorhoz. A (n)varchar(max) és varbinary(max) oszlopait hasonlítjuk össze.

Ha a SELECT záradék egyik oszlopa sem társítható a FROM záradékban azonosított táblák egyikéhez sem, mint egy összesített oszlop vagy számított oszlop esetében, az oszlopot a rendszer hozzáadja az XML-dokumentumhoz a legmélyebb beágyazási szinten, amikor az megjelenik a listában. Ha egy ilyen oszlop a SELECT záradék első oszlopaként jelenik meg, az oszlop a felső elemhez lesz hozzáadva.

Ha a csillag (*) helyettesítő karakter a SELECT záradékban van megadva, a beágyazottság a korábban ismertetett módon lesz meghatározva a lekérdezési motor által visszaadott sorok sorrendje alapján.

Következő lépések

A következő cikkek további információt nyújtanak az AUTO módról:

Lásd még: