Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
W tym artykule porównano zapytanie jednopoziomowe FOR XML z zapytaniem zagnieżdżonym FOR XML. Jedną z zalet używania zagnieżdżonych FOR XML zapytań jest możliwość określenia kombinacji kodu XML skoncentrowanego na atrybutach i elementu dla wyników zapytania. W przykładzie pokazano tę korzyść.
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
Przykłady
Poniższe SELECT zapytanie pobiera informacje o kategorii i podkategorii produktów w AdventureWorks2025 bazie danych. W zapytaniu nie ma zagnieżdżonego FOR XML.
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
Oto częściowy wynik:
<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 dyrektywę ELEMENTS w zapytaniu, otrzymasz wynik skoncentrowany na elementach, jak pokazano w poniższym fragmentcie wyniku:
<ProductCategory>
<ProductCategoryID>1</ProductCategoryID>
<CategoryName>Bike</CategoryName>
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<Name>Mountain Bike</Name>
</ProductSubCategory>
<ProductSubCategory>
...
</ProductSubCategory>
</ProductCategory>
Następnie załóżmy, że chcesz wygenerować hierarchię XML, która jest kombinacją kodu XML skoncentrowanego na atrybutach i skoncentrowanego na elementach, jak pokazano w poniższym fragmentcie:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
<ProductSubCategory>
...
<ProductSubCategory>
...
</ProductCategory>
W poprzednim fragmentze informacje o kategorii produktów, takie jak identyfikator kategorii i nazwa kategorii, są atrybutami. Jednak informacje o podkategorii są skoncentrowane na elementach. Aby skonstruować <ProductCategory> element, możesz napisać FOR XML zapytanie, jak pokazano poniżej:
SELECT ProductCategoryID,
Name AS CategoryName
FROM Production.ProductCategory ProdCat
ORDER BY ProductCategoryID
FOR XML AUTO, TYPE;
Oto wynik:
< ProdCat ProductCategoryID="1" CategoryName="Bikes" />
< ProdCat ProductCategoryID="2" CategoryName="Components" />
< ProdCat ProductCategoryID="3" CategoryName="Clothing" />
< ProdCat ProductCategoryID="4" CategoryName="Accessories" />
Aby utworzyć zagnieżdżone elementy <ProductSubCategory> w żądanym XML-u, należy dodać zagnieżdżone zapytanie FOR XML, jak pokazano w poniższym przykładzie kodu.
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;
Zwróć uwagę na następujące elementy w poprzednim zapytaniu:
Zapytanie wewnętrzne
FOR XMLpobiera informacje o podkategorii produktu.ELEMENTSDyrektywa jest dodawana do wewnętrznychFOR XML, aby wygenerować XML skoncentrowany na elementach, który jest dodawany do XML wygenerowanego przez zapytanie zewnętrzne. Domyślnie zapytanie zewnętrzne generuje kod XML skoncentrowany na atrybutach.W zapytaniu wewnętrznym dyrektywa jest określona,
TYPEwięc wynik jest typu xml . JeśliTYPEnie zostanie określony, wynik zostanie zwrócony jako typ nvarchar(max), a dane XML są zwracane jako jednostki.Zapytanie zewnętrzne określa również dyrektywę
TYPE. W związku z tym wynik tego zapytania jest zwracany do klienta jako typ xml .
Oto częściowy wynik:
<ProductCategory ProductCategoryID="1" CategoryName="Bike">
<ProductSubCategory>
<ProductSubCategoryID>1</ProductSubCategoryID>
<SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
<ProductSubCategory>
...
<ProductSubCategory>
...
</ProductCategory>
Poniższe zapytanie jest tylko rozszerzeniem poprzedniego zapytania. Przedstawia pełną hierarchię AdventureWorks2025 produktu w bazie danych. Obejmuje to:
- Kategorie produktów
- Podkategorie produktów w każdej kategorii
- Modele produktów w każdej podkategorii
- Produkty w każdym modelu
Poniższe zapytanie może być przydatne w zrozumieniu AdventureWorks2025 bazy danych:
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;
Oto częściowy wynik:
<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 dyrektywę ELEMENTS z zagnieżdżonego FOR XML zapytania, które generuje podkategorie produktów, cały wynik jest skoncentrowany na atrybutach. Możesz następnie napisać to zapytanie bez zagnieżdżania. Dodanie ELEMENTS skutkuje dokumentem XML, który jest częściowo zorientowany na atrybuty, a częściowo na elementy. Tego wyniku nie można wygenerować przez jednopoziomowe FOR XML zapytanie.