Megosztás a következőn keresztül:


Az XML-lekérdezés összehasonlítása a beágyazott FOR XML-lekérdezéssel

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a cikk egy egyszintű FOR XML lekérdezést hasonlít össze egy beágyazott lekérdezéssel FOR XML . A beágyazott FOR XML lekérdezések használatának egyik előnye, hogy attribútum-központú és elemközpontú XML-t adhat meg a lekérdezési eredményekhez. A példa ezt az előnyt mutatja be.

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

Példák

Az alábbi SELECT lekérdezés lekéri a termékkategória és az alkategóriák adatait az AdventureWorks2025 adatbázisban. Nincs beágyazott FOR XML a lekérdezésben.

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

A részleges eredmény a következő:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">
  <ProductSubCategory ProductSubCategoryID="1" Name="Mountain Bike"/>
  <ProductSubCategory ProductSubCategoryID="2" Name="Road Bike"/>
  <ProductSubCategory ProductSubCategoryID="3" Name="Touring Bike"/>
</ProductCategory>
...

Ha megadja az ELEMENTS irányelvet a lekérdezésben, elemközpontú eredményt kap, ahogyan az a következő eredménytöredékben látható:

<ProductCategory>
  <ProductCategoryID>1</ProductCategoryID>
  <CategoryName>Bike</CategoryName>
  <ProductSubCategory>
    <ProductSubCategoryID>1</ProductSubCategoryID>
    <Name>Mountain Bike</Name>
  </ProductSubCategory>
  <ProductSubCategory>
     ...
  </ProductSubCategory>
</ProductCategory>

Ezután tegyük fel, hogy olyan XML-hierarchiát szeretne létrehozni, amely az attribútum-központú és az elemközpontú XML kombinációja, ahogyan az a következő töredékben látható:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">
  <ProductSubCategory>
    <ProductSubCategoryID>1</ProductSubCategoryID>
    <SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
  <ProductSubCategory>
     ...
  <ProductSubCategory>
     ...
</ProductCategory>

Az előző töredékben a termékkategória adatai, például a kategóriaazonosító és a kategória neve attribútumok. Az alkategóriák információi azonban elemközpontúak. Az <ProductCategory> elem létrehozásához megírhat egy lekérdezést FOR XML az alábbiak szerint:

SELECT ProductCategoryID,
    Name AS CategoryName
FROM Production.ProductCategory ProdCat
ORDER BY ProductCategoryID
FOR XML AUTO, TYPE;

Az eredmény a következő:

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

A kívánt XML <ProductSubCategory> elemeit úgy hozhatja létre, hogy hozzáad egy FOR XML beágyazott lekérdezést, ahogyan az a következő kódmintában látható.

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;

Jegyezze fel a következőket az előző lekérdezésben:

  • A belső FOR XML lekérdezés lekéri a termék alkategóriáinak adatait. Az ELEMENTS irányelv a belső FOR XML részen van hozzáadva, hogy elemközpontú XML-t hozzon létre, amelyet a külső lekérdezés által létrehozott XML-hez ad hozzá. Alapértelmezés szerint a külső lekérdezés attribútumcentrikus XML-t hoz létre.

  • A belső lekérdezésben az TYPE irányelv meg van adva, így az eredmény xml típusú. Ha TYPE nincs megadva, az eredmény nvarchar(max) típusként lesz visszaadva, az XML-adatok pedig entitásokként lesznek visszaadva.

  • A külső lekérdezés a TYPE direktívát is megadja. Ezért a lekérdezés eredménye xml-típusként lesz visszaadva az ügyfélnek.

A részleges eredmény a következő:

<ProductCategory ProductCategoryID="1" CategoryName="Bike">
  <ProductSubCategory>
    <ProductSubCategoryID>1</ProductSubCategoryID>
    <SubCategoryName>Mountain Bike</SubCategoryName></ProductSubCategory>
  <ProductSubCategory>
     ...
  <ProductSubCategory>
     ...
</ProductCategory>

Az alábbi lekérdezés csak az előző lekérdezés kiterjesztése. A AdventureWorks2025 adatbázisban megjeleníti a teljes termékhierarchiát. Ez a következőket foglalja magában:

  • Termékkategóriák
  • Termék alkategóriák az egyes kategóriákban
  • Termékmodellek az egyes alkategóriákban
  • Termékek az egyes modellekben

Az adatbázis megértéséhez hasznosnak találhatja a következő lekérdezést AdventureWorks2025 :

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;

A részleges eredmény a következő:

<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>
     ...

Ha eltávolítja az irányelvet a ELEMENTS termék alkategóriáit létrehozó beágyazott FOR XML lekérdezésből, a teljes eredmény attribútum-központú. Ezután beágyazás nélkül is megírhatja ezt a lekérdezést. A ELEMENTS hozzáadása egy olyan XML-t eredményez, amely részben attribútumközpontú és részben elemközpontú. Ez az eredmény nem hozható létre egyszintű lekérdezéssel FOR XML .