W porównaniu z zagnieżdżonych kwerendy XML dla kwerendy XML
W tym temacie porównuje kwerendy XML poziom zagnieżdżonych kwerendy XML dla.Jest jedną z zalet korzystania z kwerend zagnieżdżonych XML dla określenia kombinacji zorientowany atrybut i zorientowany na element XML dla wyniki kwerendy.W przykładzie pokazano to.
Przykład
Następujące SELECT kwerenda pobiera informacje kategorii i podkategorii produktu w AdventureWorks2008R2 bazy danych.Istnieje nr zagnieżdżony w kwerendzie XML.
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
Jest to wynik częściowy:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory ProductSubCategoryID="1" Name="Mountain Bike"/>
<ProductSubCategory ProductSubCategoryID="2" Name="Road Bike"/>
<ProductSubCategory ProductSubCategoryID="3" Name="Touring Bike"/>
</ProductCategory>
...
Jeśli określisz ELEMENTS dyrektywa w kwerendzie, zostanie wyświetlony element wyśrodkowany na wynik, jak pokazano w następującym fragmencie wynik:
<ProductCategory>
<ProductCategoryID>1</ProductCategoryID>
<CategoryName>Bike</CategoryName>
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<Name>Mountain Bike</Name>
</ProductSubCategory>
<ProductSubCategory>
...
</ProductSubCategory>
</ProductCategory>
Przyjmijmy dalej, chcesz wygenerować hierarchii XML, który jest kombinacją zorientowany atrybut i zorientowany na element XML, jak pokazano w następującym fragmencie:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
<ProductSubCategory>
...
<ProductSubCategory>
...
</ProductCategory>
W poprzednim fragmencie produktów kategorii informacji, takich jak identyfikator kategorii i nazwa kategorii są atrybuty.Jednak informacje podkategorii jest zorientowany na element.Do konstruowania <ProductCategory> element, można napisać FOR XML kwerendy, jak pokazano poniżej:
SELECT ProductCategoryID, Name as CategoryName
FROM Production.ProductCategory ProdCat
ORDER BY ProductCategoryID
FOR XML AUTO, TYPE;
Jest to wynikiem:
< ProdCat ProductCategoryID="1" CategoryName="Bikes" />
< ProdCat ProductCategoryID="2" CategoryName="Components" />
< ProdCat ProductCategoryID="3" CategoryName="Clothing" />
< ProdCat ProductCategoryID="4" CategoryName="Accessories" />
Do konstruowania zagnieżdżony <ProductSubCategory> ma elementy XML, następnie dodać zagnieżdżone FOR XML kwerendy, jak pokazano poniżej:
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;
Poniższe w poprzedniej kwerendy:
Wewnętrzne FOR XML kwerenda pobiera informacje podkategoria produktu.ELEMENTS Dyrektywy dodaje się w wewnętrznych FOR XML do generowania zorientowany na element XML, który został dodany do pliku XML wygenerowanego przez kwerendę zewnętrznego.Domyślnie zewnętrznej kwerendy generuje zorientowany atrybut XML.
W kwerendzie wewnętrzne TYPE dyrektywy jest określony, więc wynik jest xml typu.Jeśli TYPE nie określono, wyniki są zwracane jako nvarchar(max) typu i dane XML są zwracane jako podmioty.
Kwerenda zewnętrznego określa również TYPE dyrektywy.Dlatego wyników tej kwerendy jest zwracany do klient jako xml typu.
Jest to wynik częściowy:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
<ProductSubCategory>
...
<ProductSubCategory>
...
</ProductCategory>
Następująca kwerenda jest tylko rozszerzenie poprzedniej kwerendy.Pokazuje hierarchię pełnego produktu w AdventureWorks2008R2 bazy danych.To obejmuje:
Kategorie produktów
Podkategorie produktów w każdej kategorii
Modele produktów w każdej podkategorii
Produkty w każdym modelu
Może być przydatne następującej kwerendy w uzgodnieniu AdventureWorks2008R2 bazy danych:
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;
Jest to wynik częściowy:
<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>
…
Jeśli usuniesz ELEMENTS dyrektywy od zagnieżdżony FOR XML kwerendę, która generuje podkategorie produktów cały wynik jest zorientowany atrybut.Następnie można zapisywać kwerendy bez zagnieżdżania.Dodanie ELEMENTS wyniki w XML jest częściowo atrybut zorientowany i częściowo element zorientowany.Wynik ten nie może być generowane przez jedno -poziom, XML dla kwerendy.