Bagikan melalui


Menghasilkan Sibling dengan Kueri Mode AUTO Bertingkat

Contoh berikut menunjukkan cara menghasilkan saudara kandung dengan menggunakan kueri mode OTOMATIS berlapis. Satu-satunya cara lain untuk menghasilkan XML tersebut adalah dengan menggunakan mode EKSPLISIT. Namun, ini bisa rumit.

Contoh

Kueri ini membangun XML yang menyediakan informasi pesanan penjualan. Ini termasuk yang berikut ini:

  • Informasi header pesanan penjualan, SalesOrderID, SalesPersonID, dan OrderDate. AdventureWorks2012 menyimpan informasi ini dalam SalesOrderHeader tabel.

  • Informasi detail pesanan penjualan. Ini termasuk satu atau beberapa produk yang dipesan, harga satuan, dan kuantitas yang dipesan. Informasi ini disimpan dalam SalesOrderDetail tabel.

  • Informasi tenaga penjual. Ini adalah tenaga penjual yang mengambil pesanan. Tabel SalesPerson menyediakan SalesPersonID. Untuk kueri ini, Anda harus menggabungkan tabel ini dengan tabel Employee untuk menemukan nama tenaga penjual.

Dua kueri berbeda SELECT yang mengikuti menghasilkan XML dengan perbedaan kecil dalam bentuk.

Kueri pertama menghasilkan XML di mana <SalesPerson> dan>SalesOrderHeader< muncul sebagai anak saudara dari :<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  

Di kueri sebelumnya, pernyataan terluar SELECT melakukan hal berikut:

  • Mengajukan query pada set data baris, SalesOrder, yang ditentukan dalam klausa FROM. Hasilnya adalah XML dengan satu atau beberapa <SalesOrder> elemen.

  • Menentukan mode AUTO dan arahan TYPE. AUTO mode mengubah hasil kueri menjadi XML, dan direktif TYPE mengembalikan hasil sebagai xml jenis.

  • Termasuk dua SELECT pernyataan berlapis, yang dipisahkan oleh koma. Berlapis SELECT pertama mengambil informasi pesanan penjualan, header dan detail, dan pernyataan berlapis SELECT kedua mengambil informasi tenaga penjual.

    • Pernyataan SELECT yang mengambil SalesOrderID, SalesPersonID, dan CustomerID mencakup pernyataan berlapis SELECT ... FOR XML lain (dengan modus AUTO dan direktif TYPE) yang mengembalikan informasi detail pesanan penjualan.

Pernyataan SELECT yang mengambil informasi tenaga penjualan menjalankan query pada set baris, SalesPerson, yang dibuat dalam klausa FROM. Agar kueri FOR XML berfungsi, Anda harus memberikan nama untuk set baris anonim yang dihasilkan oleh klausa FROM. Dalam hal ini, nama yang disediakan adalah SalesPerson.

Ini adalah hasil parsial:

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

Kueri berikut menghasilkan informasi pesanan penjualan yang sama, kecuali bahwa dalam XML yang dihasilkan, <SalesPerson> muncul sebagai saudara kandung dari :<SalesOrderDetail>

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

Ini adalah pertanyaan:

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  

Ini adalah hasilnya:

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

Karena direktif TYPE mengembalikan hasil kueri sebagai xml jenis, Anda bisa mengkueri XML yang dihasilkan dengan menggunakan berbagai xml metode jenis data. Untuk informasi selengkapnya, lihat Metode Tipe Data XML. Dalam kueri berikut, perhatikan hal berikut:

  • Kueri sebelumnya ditambahkan dalam FROM klausa. Hasil kueri dikembalikan sebagai tabel. XmlCol Perhatikan alias yang ditambahkan.

  • Klausa SELECT menentukan XQuery yang dijalankan terhadap XmlCol yang dikembalikan dalam klausa FROM. Metode query() dari tipe data xml digunakan dalam menentukan XQuery. Untuk informasi selengkapnya, lihat Metode query() (Tipe Data 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)  
    

Lihat Juga

Menggunakan Kueri XML Berlapis