Udostępnij przez


Generowanie przy użyciu kwerendy trybu automatycznego zagnieżdżone elementy równorzędne

Poniższy przykład pokazuje jak wygenerować przy użyciu trybu Autokwerenda zagnieżdżone elementy równorzędne.Tylko innym sposobem generowania takich XML jest użycie trybu JAWNE.Jednakże może to być kłopotliwe.

Przykład

Ta kwerenda konstrukcje XML, który dostarcza informacji o zamówieniu sprzedaży.To obejmuje:

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

  • Szczegółowe informacje o zamówieniu 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 sprzedawcy, który przyjął zamówienie.

Dwa odrębne kwerend, które należy wykonać Generuj XML z niewielkie różnice w kształcie.

Pierwszą kwerendę generuje XML, w którym <SalesOrderHeader> jest wyświetlany jako element równorzędny childof <SalesOrder>:

USE AdventureWorks2008R2;
GO
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)
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID
      FROM Sales.SalesOrderHeader, Sales.SalesPerson
      WHERE SalesOrderHeader.SalesPersonID = SalesPerson.BusinessEntityID
     ) AS SalesOrder
ORDER BY SalesOrder.SalesOrderID
FOR XML AUTO, TYPE;

W poprzedniej kwerendy peryferyjnych instrukcja SELECT wykonuje następujące czynności:

  • Kwerendy zestaw wierszy, SalesOrder, określony w klauzula FROM.Wynik jest XML z jednej lub kilku <SalesOrder> elementów.

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

  • Obejmuje dwa zagnieżdżonych instrukcji SELECT oddzielone przecinkami.Wybranie zagnieżdżonych pobiera informacji o zamówieniu sprzedaży, nagłówek i szczegóły, a druga instrukcja SELECT zagnieżdżona pobiera informacje o sprzedawcach.

    • Instrukcja SELECT, która pobiera SalesOrderID, SalesPersonID, i CustomerID sam zawiera inny ZAZNACZANIE zagnieżdżonych...XML instrukcja (z AUTO tryb i TYPE dyrektywy) zwracającą zamówienia sprzedaży szczegółowych informacji.

Instrukcja SELECT, która pobiera informacje o sprzedawcy kwerendy zestaw wierszy, SalesPerson, utworzony w klauzula FROM.Dla Fkwerendy lub XML do pracy, musisz podać nazwę dla anonimowych zestaw wierszy wygenerowanych w klauzula FROM.W takim przypadek podana nazwa jest SalesPerson.

Jest to wynik częściowy:

<SalesOrder>

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="29825">

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

</SalesOrder>

<SalesOrder>

<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="29672">

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />

</Sales.SalesOrderHeader>

</SalesOrder>

...

Następująca kwerenda generuje te same informacje zamówienia sprzedaży, z wyjątkiem wynikowy XML <SalesPerson> pojawia się jako element równorzędny <SalesOrderDetail>:

<SalesOrder>

<SalesOrderHeader ...>

<SalesOrderDetail .../>

<SalesOrderDetail .../>

...

<SalesPerson .../>

</SalesOrderHeader>

</SalesOrder>

<SalesOrder>

...

</SalesOrder>

To jest kwerenda:

USE AdventureWorks2008R2;
GO
SELECT 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 SalesOrderID=43659 OR SalesOrderID=43660
FOR XML AUTO, TYPE;

Jest to wynikiem:

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="29825">

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

<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="29672">

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />

</Sales.SalesOrderHeader>

Ponieważ TYPE dyrektywa zwraca wynik kwerendy jako xml Typ kwerendy można wynikowy XML przy użyciu różnych xml Typ danych metod.Aby uzyskać więcej informacji, zobacz metody typu danych xml.W następującej kwerendzie Uwaga:

  • Poprzedniej kwerendy dodaje się w FROM klauzula.Wynik kwerendy są zwracane jako tabela.Uwaga XmlCol alias, który jest dodawany.

  • SELECT klauzula określa XQuery przeciwko XmlCol w FROM klauzula.query() metoda xml jest używany typ danych, określając XQuery.Aby uzyskać więcej informacji, zobacz Query() metoda (xml typ danych).

    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)
    FROM Sales.SalesOrderHeader
    WHERE SalesOrderID='43659' or SalesOrderID='43660'
    FOR XML AUTO, TYPE ) as T(XmlCol);
    

Zobacz także

Odwołanie