Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL databáze v Microsoft Fabric
Následující příklad ukazuje, jak generovat sourozence pomocí vnořeného dotazu v režimu AUTO. Jediným jiným způsobem, jak takový KÓD XML vygenerovat, je použít explicitní režim. To ale může být těžkopádné.
Příklad
Tento dotaz vytvoří XML, který poskytuje informace o prodejní objednávce. To zahrnuje následující:
Informace o hlavičce prodejní objednávky,
SalesOrderID,SalesPersonIDaOrderDate.AdventureWorks2025tyto informace uloží do tabulkySalesOrderHeader.Informace o podrobnostech prodejní objednávky. To zahrnuje jeden nebo více objednaných produktů, jednotkovou cenu a množství objednané. Tyto informace jsou uloženy v tabulce
SalesOrderDetail.Informace o prodejní osobě. Toto je prodejce, který objednávku přijal. Tabulka
SalesPersonposkytujeSalesPersonID. Pro tento dotaz musíte tuto tabulku spojit s tabulkouEmployeea najít jméno prodejce.
Dva odlišné SELECT dotazy, které následují, generují XML s malým rozdílem ve tvaru.
První dotaz vygeneruje XML, ve kterém se <SalesPerson> a <SalesOrderHeader> zobrazí jako podřízené položky <SalesOrder>:
SELECT
(SELECT top 2 SalesOrderID, SalesPersonID, CustomerID,
(select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice
from Sales.SalesOrderDetail
WHERE SalesOrderDetail.SalesOrderID =
SalesOrderHeader.SalesOrderID
FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderHeader.SalesOrderID = SalesOrder.SalesOrderID
for xml auto, type),
(SELECT *
FROM (SELECT SalesPersonID, EmployeeID
FROM Sales.SalesPerson, HumanResources.Employee
WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As
SalesPerson
WHERE SalesPerson.SalesPersonID = SalesOrder.SalesPersonID
FOR XML AUTO, TYPE)
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID
FROM Sales.SalesOrderHeader, Sales.SalesPerson
WHERE SalesOrderHeader.SalesPersonID = SalesPerson.SalesPersonID
) as SalesOrder
ORDER BY SalesOrder.SalesOrderID
FOR XML AUTO, TYPE;
V předchozím dotazu provede vnější příkaz SELECT následující:
Dotazuje sadu řádků
SalesOrderzadané v klauzuliFROM. Výsledkem je XML s jedním nebo více<SalesOrder>elementy.Určuje režim
AUTOa direktivuTYPE.AUTOrežim transformuje výsledek dotazu na XML a direktivaTYPEvrátí výsledek jako xml typ.Obsahuje dva vnořené
SELECTpříkazy, které jsou oddělené čárkou. První vnořenýSELECTnačte informace o prodejní objednávce, záhlaví a podrobnosti a druhý vnořený příkazSELECTnačte informace o prodejci.- Příkaz
SELECT, který načítáSalesOrderID,SalesPersonIDa samotnýCustomerID, obsahuje další vnořený příkazSELECT ... FOR XML(s režimemAUTOa direktivouTYPE), který vrací informace o podrobnostech prodejní objednávky.
- Příkaz
Příkaz SELECT, který načte informace o prodejní osobě, dotazuje sadu řádků SalesPerson, vytvořenou v klauzuli FROM. Aby FOR XML dotazy fungovaly, musíte zadat název anonymní sady řádků vygenerované v klauzuli FROM. V tomto případě je zadaný název SalesPerson.
Toto je částečný výsledek:
<SalesOrder>
<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />
</Sales.SalesOrderHeader>
<SalesPerson SalesPersonID="279" EmployeeID="279" />
</SalesOrder>
...
Následující dotaz vygeneruje stejné informace o prodejní objednávce s tím rozdílem, že ve výsledném kódu XML se <SalesPerson> zobrazí jako <SalesOrderDetail>:
<SalesOrder>
<SalesOrderHeader ...>
<SalesOrderDetail .../>
<SalesOrderDetail .../>
...
<SalesPerson .../>
</SalesOrderHeader>
</SalesOrder>
<SalesOrder>
...
</SalesOrder>
Toto je dotaz:
SELECT SalesOrderID, SalesPersonID, CustomerID,
(select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice
from Sales.SalesOrderDetail
WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
FOR XML AUTO, TYPE),
(SELECT *
FROM (SELECT SalesPersonID, EmployeeID
FROM Sales.SalesPerson, HumanResources.Employee
WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson
WHERE SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID
FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 or SalesOrderID=43660
FOR XML AUTO, TYPE;
Toto je výsledek:
<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />
<SalesPerson SalesPersonID="279" EmployeeID="279" />
</Sales.SalesOrderHeader>
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="117">
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />
<SalesPerson SalesPersonID="279" EmployeeID="279" />
</Sales.SalesOrderHeader>
Vzhledem k tomu, že direktiva TYPE vrací výsledek dotazu jako typ xml, můžete výsledný kód XML dotazovat pomocí různých metod xml datových typů. Další informace naleznete ve výrazu Metody datového typu XML. V následujícím dotazu si poznamenejte následující:
Předchozí dotaz se přidá do klauzule
FROM. Výsledek dotazu se vrátí jako tabulka. Všimněte si přidaného aliasuXmlCol.Klauzule
SELECTurčuje XQuery vůčiXmlCol, které jsou vráceny v klauzuliFROM. Metodaquery()datového typu XML se používá ke specifikaci XQuery. Další informace naleznete v tématu metoda query() (datový typ xml) .SELECT XmlCol.query('<Root> { /* } </Root>') FROM ( SELECT SalesOrderID, SalesPersonID, CustomerID, (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice from Sales.SalesOrderDetail WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID FOR XML AUTO, TYPE), (SELECT * FROM (SELECT SalesPersonID, EmployeeID FROM Sales.SalesPerson, HumanResources.Employee WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson WHERE SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID FOR XML AUTO, TYPE) FROM Sales.SalesOrderHeader WHERE SalesOrderID='43659' or SalesOrderID='43660' FOR XML AUTO, TYPE ) as T(XmlCol);