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


Beágyazott FOR XML lekérdezések használata

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

Az XML- adattípusa és az XML-lekérdezések TÍPUS irányelve lehetővé teszi, hogy a FOR XML-lekérdezések által visszaadott XML feldolgozása a kiszolgálón és az ügyfélen is elvégezhető legyen.

Feldolgozás XML-típusváltozókkal

A FOR XML-lekérdezés eredményét hozzárendelheti egy xml típusváltozóhoz, vagy xQuery használatával lekérdezheti az eredményt, és hozzárendelheti az eredményt egy xml típusváltozóhoz további feldolgozás céljából.

DECLARE @x xml
SET @x=(SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID=122 or ProductModelID=119
        FOR XML RAW, TYPE)
SELECT @x
-- Result
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />
--<row ProductModelID="119" Name="Bike Wash" />

A @xváltozóban visszaadott XML-t az xml adattípus egyik metódusával is feldolgozhatja. A ProductModelID attribútum értékét például a metódus érték() használatával szerezhetjük be.

DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;

Az alábbi példában a FOR XML lekérdezés eredménye xml- típusként lesz visszaadva, mivel a TYPE irányelv a FOR XML záradékban van megadva.

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');

Ez az eredmény:

<myRoot>
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />
  <row ProductModelID="119" Name="Bike Wash" />
</myRoot>

Mivel az eredmény xml típusú, a xml adat típus metódusai közül egyet közvetlenül az XML-re alkalmazhat, mint az az alábbi lekérdezésben is látható. A lekérdezésben a query() metódus (xml adattípus) az <row> elem első <myRoot> elemének lekérésére szolgál.

SELECT  (SELECT ProductModelID, Name
         FROM Production.ProductModel
         WHERE ProductModelID=119 or ProductModelID=122
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');

Ez az eredmény:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

Belső XML-lekérdezés eredményeinek visszaadása külső lekérdezéseknek XML-típuspéldányként

Beágyazott FOR XML lekérdezéseket írhat, ahol a belső lekérdezés eredménye xml- típusként lesz visszaadva a külső lekérdezéshez. Például:

SELECT Col1,
       Col2,
       ( SELECT Col3, Col4
        FROM  T2
        WHERE T2.Col = T1.Col
        ...
        FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;

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

  • A belső FOR XML lekérdezés által létrehozott XML hozzáadódik a külső FOR XMLáltal létrehozott XML-hez.

  • A belső lekérdezés a TYPE direktívát határozza meg. Ezért a belső lekérdezés által visszaadott XML-adatok xml típusúak. Ha a TYPE direktíva nincs megadva, a belső FOR XML lekérdezés eredménye nvarchar(max), és az XML-adatok entitásként lesznek visszaadva.

Az eredményként kapott XML-adatok alakzatának szabályozása

A beágyazott XML-lekérdezésekkel jobban meghatározhatja az eredményként kapott XML-adatok alakját. Beágyazott FOR XML-lekérdezésekkel olyan XML-lekérdezéseket hozhat létre, amelyek részben attribútum-központúak, részben elemközpontúak.

További információ az attribútum- és elemközpontú XML megadásáról beágyazott FOR XML-lekérdezésekkel: lásd "Az XML-lekérdezések összehasonlítása a beágyazott FOR XML-lekérdezésekkel" és "XML alakítás beágyazott FOR XML-lekérdezésekkel".

A testvéreket tartalmazó XML-hierarchiákat az XML-lekérdezések beágyazott AUTO módjának megadásával hozhatja létre. További információ: Testvérek generálása beágyazott AUTOMATIKUS módú lekérdezéssel.

Függetlenül attól, hogy melyik módot használja, a beágyazott XML-lekérdezések nagyobb ellenőrzést biztosítanak az eredményként kapott XML alakjának leírásában. Explicit módú lekérdezések helyett használhatók.

Példák

Az alábbi témakörök példákat mutatnak be a beágyazott FOR XML-lekérdezésekre.