Udostępnij przez


DLA kwerendy XML porównanie do kwerendy zagnieżdżone FOR XML

W tym temacie porównuje kwerendy XML poziom zagnieżdżonych kwerendę FOR XML.Jest jedną z korzyści wynikające ze stosowania kwerend zagnieżdżonych FOR XML, można określić kombinacji zorientowany atrybut i zorientowany na element XML do wyniki kwerendy.W przykładzie pokazano to.

Przykład

Poniżej SELECT Program Query pobiera informacje kategorii i podkategorii produktu w AdventureWorks Baza danych. Brak nie zagnieżdżone FOR XML kwerendy.

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

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 zorientowane na element 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>

Następnie Załóż 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>

Poprzedni fragment produktu kategorii informacji, takich jak identyfikator kategorii i nazwa kategorii są atrybuty.Jednak informacje podkategorii jest zorientowane na elemencie.W celu skonstruowania <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

Oto wynik:

< ProdCat ProductCategoryID="1" CategoryName="Bikes" />
< ProdCat ProductCategoryID="2" CategoryName="Components" />
< ProdCat ProductCategoryID="3" CategoryName="Clothing" />
< ProdCat ProductCategoryID="4" CategoryName="Accessories" />

W celu skonstruowania zagnieżdżone <ProductSubCategory> elementy w formacie XML, który 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

Należy uwzględnić następujące metody w poprzedniej kwerendy:

  • Wewnętrzne FOR XML Program Query pobiera informacje o produkcie podkategorii. 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.Domyślnie zewnętrznej kwerendy generuje zorientowane na atrybut XML.

  • W kwerendzie wewnętrzne TYPE dyrektywa została określona, więc wynik jest XML typu.Jeśli TYPE nie jest określony, wyniki są zwracane jako nvarchar(max) Typ i dane XML są zwracane jako jednostki.

  • Określa również, zewnętrznej kwerendy TYPE dyrektywa. W związku z tym wynikiem 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 po prostu rozszerzeniem poprzedniej kwerendy.Pokazuje hierarchię pełnej wersji produktu w AdventureWorks Baza danych. To jest następująca:

  • 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 w następującej kwerendzie w zrozumienia AdventureWorks Baza 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>
     …

Po usunięciu ELEMENTS dyrektywa z zagnieżdżone FOR XML kwerendy, która generuje podkategorie produktów cały wynik jest zorientowane na atrybut. Następnie można wpisać tę kwerendę bez zagnieżdżania.Dodanie ELEMENTS wyniki w XML jest częściowo atrybut zorientowany i częściowo element zorientowany. Nie można wygenerować ten wynik kwerendy XML poziom podstawowym.

See Also

Reference