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


Testvérek létrehozása beágyazott AUTO módú lekérdezéssel

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Az alábbi példa bemutatja, hogyan hozhat létre testvéreket beágyazott AUTO módú lekérdezéssel. Az ILYEN XML-fájlok létrehozásának egyetlen másik módja az EXPLICIT mód használata. Ez azonban nehézkes lehet.

Példa

Ez a lekérdezés olyan XML-fájlt hoz létre, amely értékesítési rendelés adatait tartalmazza. Ez a következőket foglalja magában:

  • Értékesítési rendelés fejlécének adatai, SalesOrderID, SalesPersonIDés OrderDate. AdventureWorks2025 ezeket az adatokat a SalesOrderHeader táblában tárolja.

  • Értékesítési rendelés részleteinek adatai. Ide tartozik egy vagy több megrendelt termék, az egységár és a megrendelt mennyiség. Ezeket az információkat a rendszer a SalesOrderDetail táblában tárolja.

  • Értékesítési személy adatai. Ő az értékesítő, aki átvette a rendelést. A SalesPerson tábla biztosítja a SalesPersonID. Ehhez a lekérdezéshez csatlakoztatnia kell ezt a táblát a Employee táblához az értékesítési személy nevének megkereséséhez.

A két különböző SELECT lekérdezések, amelyek követik, létrehoznak XML-t, kis különbséggel az alakzatban.

Az első lekérdezés xml-fájlt hoz létre, amelyben <SalesPerson> és <SalesOrderHeader><SalesOrder>testvérgyermekeként jelennek meg:

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;

Az előző lekérdezésben a legkülső SELECT utasítás a következőket teszi:

  • Lekérdezi a sorhalmazt SalesOrder, amelyet a FROM záradékban adtak meg. Az eredmény egy legalább egy <SalesOrder> elemet tartalmazó XML.

  • A AUTO módot és a TYPE direktívát adja meg. AUTO mód XML-vé alakítja át a lekérdezés eredményét, és a TYPE irányelv xml- típusként adja vissza az eredményt.

  • Két beágyazott SELECT utasítást tartalmaz vesszővel elválasztva. Az első beágyazott SELECT lekéri az értékesítési rendelés fejlécének és részleteinek adatait, a második beágyazott SELECT utasítás pedig lekéri az üzletkötő adatait.

    • A SELECT, SalesOrderIDés SalesPersonID lekérő CustomerID utasítás tartalmaz egy másik beágyazott SELECT ... FOR XML utasítást (AUTO móddal és TYPE irányelvvel), amely az értékesítési rendelés részletes adatait adja vissza.

Az értékesítési személy adatait lekérő SELECT utasítás lekérdezi a SalesPerson záradékban létrehozott sorhalmazt, FROM. Ahhoz, hogy FOR XML lekérdezések működjenek, meg kell adnia a FROM záradékban létrehozott névtelen sorkészlet nevét. Ebben az esetben a megadott név SalesPerson.

Ez a részleges eredmény:

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

A következő lekérdezés ugyanazokat az értékesítési rendelési adatokat hozza létre, kivéve, hogy az eredményként kapott XML-fájlban a <SalesPerson><SalesOrderDetail>testvéreként jelenik meg:

<SalesOrder>
    <SalesOrderHeader ...>
          <SalesOrderDetail .../>
          <SalesOrderDetail .../>
          ...
          <SalesPerson .../>
    </SalesOrderHeader>

</SalesOrder>
<SalesOrder>
  ...
</SalesOrder>

Ez a lekérdezés:

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;

Ez az eredmény:

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

Mivel a TYPE irányelv xml típusú lekérdezési eredményt ad vissza, az eredményül kapott XML-t különböző xml adattípus-metódusok használatával kérdezheti le. További információ: xml adattípus-metódusok. A következő lekérdezésben jegyezze fel a következőket:

  • Az előző lekérdezés bekerül a FROM záradékba. A lekérdezés eredménye táblaként lesz visszaadva. Jegyezze fel a hozzáadott XmlCol aliast.

  • A SELECT záradék egy XQuery-t határoz meg a XmlCol záradékban visszaadott FROM ellen. Az XQuery megadásához az query() adattípus metódusa használható. További információ: query() metódus (xml adattípus).

    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);
    

Lásd még: