Použijte AUTO režim s FOR XML
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Jak je popsáno v FOR XML (SQL Server), vrátí režim AUTO výsledky dotazu jako vnořené elementy XML. To neposkytuje velkou kontrolu nad tvarem XML vygenerovaného z výsledku dotazu. Dotazy v režimu AUTO jsou užitečné, pokud chcete vygenerovat jednoduché hierarchie. Ale Použití explicitního režimu s FOR XML a Použití režimu PATH s FOR XML poskytuje větší kontrolu a flexibilitu při rozhodování o tvaru XML z výsledku dotazu.
Každá tabulka v klauzuli FROM, ze které je v klauzuli SELECT uveden alespoň jeden sloupec, je reprezentována jako element XML. Sloupce uvedené v klauzuli SELECT jsou mapovány na atributy nebo dílčí prvky, pokud je v klauzuli FOR XML zadána volitelná možnost ELEMENTS.
Hierarchie XML, vnoření elementů, ve výsledném XML je založená na pořadí tabulek identifikovaných sloupci zadanými v klauzuli SELECT. Proto je důležité pořadí, ve kterém jsou názvy sloupců zadány v klauzuli SELECT. První, úplně levá tabulka, která je identifikována tvoří horní prvek ve výsledném dokumentu XML. Druhá tabulka úplně vlevo, identifikovaná sloupci v příkazu SELECT, tvoří podelement uvnitř horního elementu atd.
Pokud je název sloupce uvedený v klauzuli SELECT z tabulky, která je již identifikována dříve zadaným sloupcem v klauzuli SELECT, sloupec se přidá jako atribut prvku, který je již vytvořen, místo otevření nové úrovně hierarchie. Pokud je zadána možnost ELEMENTS, sloupec se přidá jako atribut.
Spusťte například tento dotaz:
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;
Toto je částečný výsledek:
<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>
...
Všimněte si následující položky v klauzuli SELECT:
ID zákazníka odkazuje na tabulku Cust. Proto je vytvořen prvek
<Cust>
a CustomerID se přidá jako jeho atribut.Dále tři sloupce, OrderHeader.CustomerID, OrderHeader.SaleOrderID a OrderHeader.Status, odkazují na tabulku OrderHeader. Proto je prvek
<OrderHeader>
přidán jako dílčí prvek<Cust>
a tři sloupce jsou přidány jako atributy<OrderHeader>
.Dále sloupec Cust.CustomerType znovu odkazuje na tabulku Cust, která již byla identifikována sloupcem Cust.CustomerID. Proto se nevytvořil žádný nový prvek. Místo toho je atribut CustomerType přidán do
<Cust>
elementu, který byl dříve vytvořen.Dotaz určuje aliasy pro názvy tabulek. Tyto aliasy se zobrazují jako odpovídající názvy prvků.
ORDER BY je nezbytné pro seskupení všech podřízených prvků pod jednoho nadřazeného rodiče.
Tento dotaz je podobný předchozímu, s výjimkou klauzule SELECT určuje sloupce v tabulce OrderHeader před sloupce v tabulce Cust. Proto se nejprve <OrderHeader>
element vytvoří a potom <Cust>
podřízený prvek se do něj přidá.
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;
Toto je částečný výsledek:
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
<Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...
Pokud je v klauzuli FOR XML přidána možnost ELEMENTS, vrátí se xml orientovaný na element.
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
Toto je částečný výsledek:
<Cust>
<CustomerID>1</CustomerID>
<CustomerType>S</CustomerType>
<OrderHeader>
<CustomerID>1</CustomerID>
<SalesOrderID>43860</SalesOrderID>
<Status>5</Status>
</OrderHeader>
...
</Cust>
...
V tomto dotazu se hodnoty CustomerID porovnávají z jednoho řádku na druhý při vytváření prvků <Cust>, protože ID zákazníka je primárním klíčem tabulky. Pokud customerID není identifikovaný jako primární klíč tabulky, všechny hodnoty sloupců (CustomerID, CustomerType v tomto dotazu) se porovnávají z jednoho řádku na druhý. Pokud se hodnoty liší, do XML se přidá nový <Cust> element.
Při porovnávání hodnot těchto sloupců, pokud některý ze sloupců, které chcete porovnat, je typu text, ntext, obrázeknebo xml, funkce FOR XML předpokládá, že hodnoty jsou odlišné a nejsou porovnávány, i když mohou být ve skutečnosti stejné. Důvodem je to, že porovnání velkých objektů není podporováno. Prvky se přidají do výsledku pro každý vybraný řádek. Porovnávají se sloupce (n)varchar(max) a varbinary(max).
Pokud sloupec v klauzuli SELECT není možné přidružit k žádné z tabulek identifikovaných v klauzuli FROM, jako v případě agregovaného sloupce nebo počítaného sloupce, přidá se sloupec do dokumentu XML na nejnižší úrovni vnoření na místě, když se narazí v seznamu. Pokud se takový sloupec zobrazí jako první sloupec v klauzuli SELECT, sloupec se přidá do horního prvku.
Pokud je v klauzuli SELECT zadán zástupný znak hvězdičky (*), je vnoření určeno stejným způsobem jako dříve popsané v závislosti na pořadí, v jakém jsou řádky vráceny dotazovacím strojem.
Další kroky
Další informace o automatickém režimu najdete v následujících článcích:
Příklady : Použití automatického režimu