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


XML formázása beágyazott FOR XML-lekérdezésekkel

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

Az alábbi példa lekérdezi a Production.Product táblát egy adott termék ListPrice és StandardCost értékeinek lekéréséhez. A lekérdezés érdekesebbé tétele érdekében a rendszer mindkét árat egy <Price> elemben adja vissza, és minden <Price> elem PriceType attribútummal rendelkezik.

Példa

Ez az XML várt alakja:

<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="Production.Product" type="xsd:anyType" />
</xsd:schema>
<Production.Product xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2" ProductID="520">
  <Price xmlns="" PriceType="ListPrice">133.34</Price>
  <Price xmlns="" PriceType="StandardCost">98.77</Price>
</Production.Product>

Ez a beágyazott FOR XML lekérdezés:

USE AdventureWorks2022;
GO
SELECT Product.ProductID,
          (SELECT 'ListPrice' as PriceType,
                   CAST(CAST(ListPrice as NVARCHAR(40)) as XML)
           FROM    Production.Product Price
           WHERE   Price.ProductID=Product.ProductID
           FOR XML AUTO, TYPE),
          (SELECT  'StandardCost' as PriceType,
                   CAST(CAST(StandardCost as NVARCHAR(40)) as XML)
           FROM    Production.Product Price
           WHERE   Price.ProductID=Product.ProductID
           FOR XML AUTO, TYPE)
FROM Production.Product
WHERE ProductID=520
for XML AUTO, TYPE, XMLSCHEMA;

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

  • A külső SELECT utasítás egy <Product> elemet hoz létre, amely ProductID attribútummal és két <Price> gyermekelemmel rendelkezik.

  • A két belső SELECT utasítás két <Price> elemet hoz létre, amelyek mindegyike egy PriceType attribútummal és a termék árát visszaadó XML-vel rendelkezik.

  • A külső SELECT utasítás XMLSCHEMA-irányelve létrehozza a beágyazott XSD-sémát, amely az eredményként kapott XML alakját írja le.

A lekérdezés érdekesebbé tétele érdekében megírhatja az XML-lekérdezést, majd xQueryt írhat az eredményhez az XML újraformázásához, ahogyan az az alábbi lekérdezésben látható:

SELECT ProductID,
( SELECT p2.ListPrice, p2.StandardCost
   FROM Production.Product p2
   WHERE Product.ProductID = p2.ProductID
   FOR XML AUTO, ELEMENTS XSINIL, type ).query('
                                   for $p in /p2/*
                                   return
                                    <Price PriceType = "{local-name($p)}">
                                     { data($p) }
                                    </Price>
                                  ')
FROM Production.Product
WHERE ProductID = 520
FOR XML AUTO, TYPE;

Az előző példa az query() adattípus metódusával kérdezi le a belső FOR XML-lekérdezés által visszaadott XML-t, és a várt eredményt hozza létre.

Ez az eredmény:

<Production.Product ProductID="520">
  <Price PriceType="ListPrice">133.3400</Price>
  <Price PriceType="StandardCost">98.7700</Price>
</Production.Product>

Lásd még: