Bagikan melalui


Untuk Kueri XML Dibandingkan dengan Kueri XML Berlapis

Topik ini membandingkan kueri FOR XML tingkat tunggal dengan kueri XML berlapis. Salah satu manfaat menggunakan kueri FOR XML berlapis adalah Anda dapat menentukan kombinasi XML yang ber sentris atribut dan elemen untuk hasil kueri. Contoh menunjukkan ini.

Contoh

Kueri berikut SELECT mengambil kategori produk dan informasi subkategori dalam database AdventureWorks2012 . Tidak ada XML berlapis untuk xml dalam kueri.

USE AdventureWorks2012;  
GO  
SELECT   ProductCategory.ProductCategoryID,   
         ProductCategory.Name as CategoryName,  
         ProductSubCategory.ProductSubCategoryID,   
         ProductSubCategory.Name  
FROM     Production.ProductCategory, Production.ProductSubCategory  
WHERE    ProductCategory.ProductCategoryID = ProductSubCategory.ProductCategoryID  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  
GO  

Ini adalah hasil parsial:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">  
  <ProductSubCategory ProductSubCategoryID="1" Name="Mountain Bike"/>  
  <ProductSubCategory ProductSubCategoryID="2" Name="Road Bike"/>  
  <ProductSubCategory ProductSubCategoryID="3" Name="Touring Bike"/>  
</ProductCategory>  
...  

Jika Anda menentukan direktif ELEMENTS dalam kueri, Anda menerima hasil yang berpusat pada elemen, seperti yang diperlihatkan dalam fragmen hasil berikut:

<ProductCategory>  
  <ProductCategoryID>1</ProductCategoryID>  
  <CategoryName>Bike</CategoryName>  
  <ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <Name>Mountain Bike</Name>  
  </ProductSubCategory>  
  <ProductSubCategory>  
     ...  
  </ProductSubCategory>  
</ProductCategory>  

Selanjutnya, asumsikan bahwa Anda ingin menghasilkan hierarki XML yang merupakan kombinasi XML yang berpusat pada atribut dan elemen, seperti yang ditunjukkan dalam fragmen berikut:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">  
  <ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>  
  <ProductSubCategory>  
     ...  
  <ProductSubCategory>  
     ...  
</ProductCategory>  

Dalam fragmen sebelumnya, informasi kategori produk seperti ID kategori dan nama kategori adalah atribut. Namun, informasi subkataan berfokus pada elemen. Untuk membuat <ProductCategory> elemen, Anda bisa menulis kueri seperti yang FOR XML diperlihatkan dalam hal berikut ini:

SELECT ProductCategoryID, Name as CategoryName  
FROM Production.ProductCategory ProdCat  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  

Ini adalah hasilnya:

< ProdCat ProductCategoryID="1" CategoryName="Bikes" />  
< ProdCat ProductCategoryID="2" CategoryName="Components" />  
< ProdCat ProductCategoryID="3" CategoryName="Clothing" />  
< ProdCat ProductCategoryID="4" CategoryName="Accessories" />  

Untuk membuat elemen berlapis <>ProductSubCategorydi XML yang Anda inginkan, Anda kemudian menambahkan kueri berlapisFOR XML, seperti yang diperlihatkan dalam hal berikut ini:

SELECT ProductCategoryID, Name as CategoryName,  
       (SELECT ProductSubCategoryID, Name SubCategoryName  
        FROM   Production.ProductSubCategory  
        WHERE ProductSubCategory.ProductCategoryID =   
              ProductCategory.ProductCategoryID  
        FOR XML AUTO, TYPE, ELEMENTS  
       )  
FROM Production.ProductCategory  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  

Perhatikan hal berikut ini di kueri sebelumnya:

  • Kueri dalam FOR XML mengambil informasi subkataan produk. Direktif ELEMENTS ditambahkan di dalam FOR XML untuk menghasilkan XML yang berpusat pada elemen yang ditambahkan ke XML yang dihasilkan oleh kueri luar. Secara default, kueri luar menghasilkan XML yang ber sentris atribut.

  • Dalam kueri dalam, direktif TYPE ditentukan sehingga hasilnya adalah jenis xml . Jika TYPE tidak ditentukan, hasilnya dikembalikan sebagai nvarchar(max) jenis dan data XML dikembalikan sebagai entitas.

  • Kueri luar juga menentukan arahan TYPE . Oleh karena itu, hasil kueri ini dikembalikan ke klien sebagai jenis xml .

Ini adalah hasil parsial:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">  
  <ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>  
  <ProductSubCategory>  
     ...  
  <ProductSubCategory>  
     ...  
</ProductCategory>  

Kueri berikut ini hanyalah ekstensi dari kueri sebelumnya. Ini menunjukkan hierarki produk lengkap dalam database AdventureWorks2012 . Ini termasuk yang berikut:

  • Kategori Produk

  • Subkategori produk di setiap kategori

  • Model produk di setiap subkataan

  • Produk di setiap model

Anda mungkin menemukan kueri berikut berguna dalam memahami database AdventureWorks2012 :

SELECT ProductCategoryID, Name as CategoryName,  
       (SELECT ProductSubCategoryID, Name SubCategoryName,  
               (SELECT ProductModel.ProductModelID,   
                       ProductModel.Name as ModelName,  
                       (SELECT ProductID, Name as ProductName, Color  
                        FROM   Production.Product  
                        WHERE  Product.ProductModelID =   
                               ProductModel.ProductModelID  
                        FOR XML AUTO, TYPE)  
                FROM   (SELECT distinct ProductModel.ProductModelID,   
                               ProductModel.Name  
                        FROM   Production.ProductModel,   
                               Production.Product  
                        WHERE  ProductModel.ProductModelID =   
                               Product.ProductModelID  
                        AND    Product.ProductSubCategoryID =   
                               ProductSubCategory.ProductSubCategoryID)   
                                  ProductModel  
                FOR XML AUTO, type  
               )  
        FROM Production.ProductSubCategory  
        WHERE ProductSubCategory.ProductCategoryID =   
              ProductCategory.ProductCategoryID  
        FOR XML AUTO, TYPE, ELEMENTS  
       )  
FROM Production.ProductCategory  
ORDER BY ProductCategoryID  
FOR XML AUTO, TYPE  

Ini adalah hasil parsial:

<Production.ProductCategory ProductCategoryID="1" CategoryName="Bikes">  
  <Production.ProductSubCategory>  
    <ProductSubCategoryID>1</ProductSubCategoryID>  
    <SubCategoryName>Mountain Bikes</SubCategoryName>  
    <ProductModel ProductModelID="19" ModelName="Mountain-100">  
      <Production.Product ProductID="771"   
                ProductName="Mountain-100 Silver, 38" Color="Silver" />  
      <Production.Product ProductID="772"   
                ProductName="Mountain-100 Silver, 42" Color="Silver" />  
      <Production.Product ProductID="773"   
                ProductName="Mountain-100 Silver, 44" Color="Silver" />  
        ...  
    </ProductModel>  
     ...  

Jika Anda menghapus direktif ELEMENTS dari kueri berlapis FOR XML yang menghasilkan subkataan produk, seluruh hasilnya berpusat pada atribut. Anda kemudian dapat menulis kueri ini tanpa bersarang. Penambahan ELEMENTS hasil dalam XML yang sebagian bersifat atribut-sentris dan sebagian elemen-sentris. Hasil ini tidak dapat dihasilkan oleh kueri FOR XML tingkat tunggal.

Lihat juga

Gunakan Kueri BERlapis UNTUK XML