Udostępnij za pośrednictwem


Generowanie przy użyciu kwerendy trybie AUTO zagnieżdżone elementy równorzędne

W poniższym przykładzie pokazano, jak wygenerować elementy równorzędne za pomocą kwerendy zagnieżdżone trybie AUTO.Jest to tylko inne sposób generowania takie XML do pracy w trybie JAWNE.Jednakże może to być kłopotliwe.

Przykład

Ta kwerenda konstrukcji XML, który dostarcza informacji o zamówieniu sprzedaży.To jest następująca:

  • Sales order header information, SalesOrderID, SalesPersonID, and OrderDate.AdventureWorks stores this information in the SalesOrderHeader table.

  • Informacje szczegółowe zamówienia sprzedaży.Obejmuje to jeden lub więcej produktów zamówionych, cena jednostkowa i ilość zamówiona.Te informacje są przechowywane w SalesOrderDetail Tabela.

  • Informacje o sprzedawcy.Jest to sprzedawcę, który miał zamówienia.The SalesPerson tabela provides the SalesPersonID. Dla tej kwerendy, należy przyłączyć się w tej tabeli do Employee Tabela w celu znalezienia nazwiska sprzedawcy.

Dwie różne SELECT kwerendy, które należy wykonać generowanie XML z niewielkie różnice w kształcie.

Pierwszą kwerendę generuje XML, w którym <SalesPerson> i <SalesOrderHeader> są wyświetlane jako elementy podrzędne tego samego poziomu <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

W poprzedniej kwerendy skrajnie zewnętrznych SELECT instrukcja wykonuje następujące czynności:

  • Wykonuje kwerendę dotyczącą zestawu zestaw wierszy, SalesOrder, określonego w FROM Klauzula. Wynik jest XML z jednym lub kilkoma <SalesOrder> elementy.

  • Specifies AUTO mode and the TYPE directive.AUTO mode transforms the query result into XML, and the TYPE directive returns the result as xml type.

  • Zawiera dwa zagnieżdżone SELECT instrukcje oddzielone przecinkami. Pierwszy zagnieżdżone SELECT pobiera informacji o zamówieniu sprzedaży, nagłówku i szczegóły i drugi zagnieżdżone SELECT Instrukcja pobiera informacje o sprzedawcy.

    • The SELECT instrukcja that retrieves SalesOrderID, SalesPersonID, and CustomerID itself includes another nested SELECT ... FOR XML instrukcja (with AUTO mode and TYPE directive) that returns sales order detail information.

The SELECT instrukcja that retrieves the sales person information queries a zestaw wierszy, SalesPerson, created in the FROM klauzula. Dla FOR XML kwerendy do pracy, musisz podać nazwę zestawu zestaw wierszy anonimowego generowany w FROM Klauzula. W takim przypadek jest podana nazwa SalesPerson.

Jest to wynik częściowy:

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

Następująca kwerenda generuje te same informacje zamówienia sprzedaży, z wyjątkiem tych, w wynikowym pliku XML, <SalesPerson> pojawia się jako podrzędne z <SalesOrderDetail>:

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

To jest kwerenda:

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

Oto wynik:

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

Ponieważ TYPE dyrektywa zwraca zestawu wyników jako XML typu, można wysyłać kwerendy wynikowy XML przy użyciu różnych xml metody typu danych. Aby uzyskać więcej informacji zobacz Metody typu danych XML.W następującej kwerendzie należy pamiętać o następujących kwestiach:

  • Poprzedniej kwerendy jest dodawana do FROM Klauzula. Wynik kwerendy są zwracane jako tabela.Uwaga XmlCol alias, który został dodany.

  • The SELECT klauzula specifies an XQuery against the XmlCol returned in the FROM klauzula. The query() metoda of the xml data type is used in specifying the XQuery. Aby uzyskać więcej informacji zobaczquery() Method (xml Data Type).

    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)
    

See Also

Reference