xml sorgu için iç içe for xml sorgu karşılaştırılması
Bu konuda tek - karşılaştırırdüzey for xml sorgu için iç içe for xml sorgu.İç içe for xml sorguları kullanmanın yararları biridir öznitelik merkezli ve öğe merkezli bir xml sorgu için bir birleşimi belirtmek sonuçlar.Bu örnek gösterilmiştir.
Örnek
Aşağıdaki SELECT sorgunun aldığı ürün kategori ve alt kategori bilgileri AdventureWorks2008R2 veritabanı.Yok Hayır xml için sorgu içinde iç içe.
USE AdventureWorks2008R2;
GO
SELECT ProductCategory.ProductCategoryID,
ProductCategory.Name as CategoryName,
ProductSubcategory.ProductSubcategoryID,
ProductSubcategory.Name
FROM Production.ProductCategory
INNER JOIN Production.ProductSubcategory
ON ProductCategory.ProductCategoryID = ProductSubcategory.ProductCategoryID
ORDER BY ProductCategoryID
FOR XML AUTO, TYPE;
GO
Bu kısmi bir sonucudur:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory ProductSubCategoryID="1" Name="Mountain Bike"/>
<ProductSubCategory ProductSubCategoryID="2" Name="Road Bike"/>
<ProductSubCategory ProductSubCategoryID="3" Name="Touring Bike"/>
</ProductCategory>
...
Belirtirseniz, ELEMENTS sorgu yönergesi içeriyorsa, öğe merkezli bir sonuç aşağıdaki sonucu parçasında gösterildiği gibi alırsınız:
<ProductCategory>
<ProductCategoryID>1</ProductCategoryID>
<CategoryName>Bike</CategoryName>
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<Name>Mountain Bike</Name>
</ProductSubCategory>
<ProductSubCategory>
...
</ProductSubCategory>
</ProductCategory>
Daha sonra aşağıdaki parçasında gösterildiği gibi xml öznitelik merkezli ve öğe merkezli, birleşimi olan bir xml hiyerarşisi oluşturmak istediğinizi varsayalım:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
<ProductSubCategory>
...
<ProductSubCategory>
...
</ProductCategory>
Önceki parçaya, ürün kategori kategori kimliği ve kategori adı gibi bilgilerdir öznitelikleri.Ancak, alt kategori öğesi merkezli bilgilerdir.Oluşturmak için <ProductCategory> yazma öğesi, bir FOR XML Aşağıdaki gösterildiği gibi sorgulama:
SELECT ProductCategoryID, Name as CategoryName
FROM Production.ProductCategory ProdCat
ORDER BY ProductCategoryID
FOR XML AUTO, TYPE;
Bu sonucu verir:
< ProdCat ProductCategoryID="1" CategoryName="Bikes" />
< ProdCat ProductCategoryID="2" CategoryName="Components" />
< ProdCat ProductCategoryID="3" CategoryName="Clothing" />
< ProdCat ProductCategoryID="4" CategoryName="Accessories" />
İç içe geçmiş yapısı oluşturmak için <ProductSubCategory> istediğiniz xml öğeleri, sonra eklediğiniz bir iç içe geçmiş FOR XML Aşağıdaki gösterildiği gibi sorgulama:
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;
Önceki sorgu aşağıdaki unutmayın:
İç FOR XML sorgunun aldığı ürün alt kategori bilgileri.The ELEMENTS directive is added in the inner FOR XML to generate element-centric XML that is added to the XML generated by the outer query.Varsayılan olarak, xml öznitelik merkezli dış sorgu oluşturur.
İç sorgunun içinde TYPE sonuç olur böylece yönergesi belirtilen xml türü.If TYPE is not specified, the result is returned as nvarchar(max) type and the XML data is returned as entities.
Ayrıca dış sorgu belirtir TYPE yönergesi.Bu nedenle, bu sorgu sonucu istemci döndürülen xml türü.
Bu kısmi bir sonucudur:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
<ProductSubCategory>
...
<ProductSubCategory>
...
</ProductCategory>
Aşağıdaki sorgu yalnızca bir önceki sorgunun uzantısıdır.Tam ürün hiyerarşik olarak gösterir AdventureWorks2008R2 veritabanı.Bu özellikler şunlardır:
Ürün kategorileri
Her kategorideki ürün alt kategorisi
Ürün modellerine dahil her alt kategorisi
Her modelinde ürünleri
Aşağıdaki sorgu anlamak yararlı bulabileceğiniz AdventureWorks2008R2 Veritabanı:
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;
Bu kısmi bir sonucudur:
<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>
…
Siz kaldırırsanız, ELEMENTS yönergesi'nden iç içe FOR XML ürün kategorilerini üretir sorgu öznitelik merkezli bütün sonuç.Bu sorguya almadan sonra yazabilirsiniz.Ayrıca ELEMENTS , kısmen öznitelik merkezli ve kısmen öğe merkezli bir xml sonuçlar.Bu sonuç bir tek - tarafından üretilemiyordüzey, for xml sorgu.