Sdílet prostřednictvím


Generování sourozenců pomocí vnořeného dotazu v režimu AUTO

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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, SalesPersonIDa OrderDate. AdventureWorks2025 tyto informace uloží do tabulky SalesOrderHeader.

  • 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 SalesPerson poskytuje SalesPersonID. Pro tento dotaz musíte tuto tabulku spojit s tabulkou Employee a 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 klauzuli FROM. Výsledkem je XML s jedním nebo více <SalesOrder> elementy.

  • Určuje režim AUTO a direktivu TYPE. AUTO režim transformuje výsledek dotazu na XML a direktiva TYPE vrátí výsledek jako xml typ.

  • Obsahuje dva vnořené SELECT příkazy, které jsou oddělené čárkou. První vnořený SELECT načte informace o prodejní objednávce, záhlaví a podrobnosti a druhý vnořený příkaz SELECT načte informace o prodejci.

    • Příkaz SELECT, který načítá SalesOrderID, SalesPersonIDa samotný CustomerID, obsahuje další vnořený příkaz SELECT ... FOR XML (s režimem AUTO a direktivou TYPE), který vrací informace o podrobnostech prodejní objednávky.

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

  • Klauzule SELECT určuje XQuery vůči XmlCol, které jsou vráceny v klauzuli FROM. Metoda query() 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);
    

Viz také