Bagikan melalui


Untuk kueri XML dibandingkan dengan kueri XML berlapis

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022 database sampel, yang dapat Anda unduh dari beranda Sampel Microsoft SQL Server dan Proyek Komunitas.

Contoh

Kueri berikut SELECT mengambil kategori produk dan informasi subkategori dalam AdventureWorks2022 database. Tidak ada berlapis FOR XML dalam kueri.

USE AdventureWorks2022;
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

Berikut hasil parsialnya:

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

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

Berikut 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 <ProductSubCategory> di XML yang Anda inginkan, Anda kemudian menambahkan kueri berlapis FOR XML , seperti yang diperlihatkan dalam sampel kode berikut:

SELECT ProductCategoryID,
    Name AS CategoryName,
    (
        SELECT ProductSubCategoryID, Name AS 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 jenis nvarchar(maks) dan data XML dikembalikan sebagai entitas.

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

Berikut hasil parsialnya:

<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 AdventureWorks2022 database. Drive ini termasuk:

  • Kategori Produk
  • Subkategori produk di setiap kategori
  • Model produk di setiap subkataan
  • Produk di setiap model

Anda mungkin menemukan kueri berikut berguna dalam memahami AdventureWorks2022 database:

SELECT ProductCategoryID,
    Name AS CategoryName,
    (
        SELECT ProductSubCategoryID,
            Name AS 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;

Berikut hasil parsialnya:

<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 subkatoner produk, seluruh hasilnya berpusat pada atribut. Anda kemudian dapat menulis kueri ini tanpa bersarang. Penambahan ELEMENTS hasil dalam XML yang sebagian berentrik atribut dan sebagian elemen-sentris. Hasil ini tidak dapat dihasilkan oleh kueri tingkat FOR XML tunggal.