Sdílet prostřednictvím


Použití vnořených dotazů FOR XML

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Datový typ xml a direktiva TYPE v dotazech FOR XML umožňují, aby bylo XML vrácené dotazy FOR XML zpracováno jak na serveru, tak na klientovi.

Zpracování s proměnnými typu XML

Výsledek dotazu FOR XML můžete přiřadit proměnné typu xml nebo použít XQuery k dotazování výsledku a tento výsledek přiřadit xml proměnné typu pro další zpracování.

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" />

Kód XML vrácený v proměnné @xmůžete dále zpracovat pomocí jedné z metod typu dat xml. Můžete například načíst hodnotu atributu ProductModelID pomocí metody value().

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

V následujícím příkladu se výsledek dotazu FOR XML vrátí jako typ xml, protože direktiva TYPE je zadána v klauzuli FOR XML.

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

Toto je výsledek:

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

Vzhledem k tomu, že výsledkem je xml typ, můžete zadat jednu z metod xml datového typu přímo proti tomuto XML, jak je znázorněno v následujícím dotazu. V dotazu se metoda query() (xml Data Type) používá k načtení prvního podřízeného prvku <row> elementu <myRoot>.

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

Toto je výsledek:

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

Vrácení vnitřních výsledků dotazu FOR XML do vnějších dotazů jako instance typu xml

Můžete napsat vnořené FOR XML dotazy, ve kterých se výsledek vnitřního dotazu vrátí jako xml typ do vnějšího dotazu. Například:

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

Všimněte si následujících věcí z předchozího dotazu:

  • XML, který vygeneroval vnitřní dotaz FOR XML, je přidán k XML vygenerovanému vnějším dotazem FOR XML.

  • Vnitřní dotaz určuje direktivu TYPE. Proto data XML vrácená vnitřním dotazem jsou xml typu. Pokud není zadána direktiva TYPE, vrátí se výsledek vnitřního dotazu FOR XML jako nvarchar(max) a data XML jsou entitována.

Řízení tvaru výsledných dat XML

Vnořené dotazy FOR XML poskytují větší kontrolu nad definováním tvaru výsledných dat XML. Vnořené dotazy FOR XML můžete použít k vytvoření XML, který je částečně orientovaný na atribut a částečně orientovaný na elementy.

Další informace o zadávání XML orientovaných na atributy i elementy s vnořenými dotazy FOR XML naleznete v tématu Porovnání dotazu FOR XML s vnořeným dotazem FOR XML a Formování XML pomocí vnořených dotazů FOR XML.

Hierarchie XML, které zahrnují elementy na stejné úrovni, můžete vygenerovat zadáním vnořeného automatického režimu pro dotazy XML. Další informace najdete v tématu Vytváření sourozenců s vnořeným dotazem v režimu AUTO.

Bez ohledu na režim, který použijete, poskytují vnořené dotazy FOR XML větší kontrolu nad popisem tvaru výsledného XML. Dají se použít místo dotazů explicitního režimu.

Příklady

Následující témata obsahují příklady vnořených dotazů FOR XML.