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. DirektifELEMENTS
ditambahkan di dalamFOR 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 . JikaTYPE
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.
Konten terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk