Condividi tramite


Utilizzo di query FOR XML nidificate

Il xml tipo di dati e la direttiva TYPE nelle query FOR XML consentono l'elaborazione del codice XML restituito dalle query FOR XML nel server e nel client.

Elaborazione con variabili di tipo xml

È possibile assegnare il risultato della query FOR XML a una xml variabile di tipo oppure usare XQuery per eseguire una query sul risultato e assegnare tale risultato a una xml variabile di tipo per un'ulteriore elaborazione.

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

È anche possibile elaborare il codice XML restituito nella variabile , @xutilizzando uno dei metodi del xml tipo di dati . Ad esempio, è possibile recuperare il valore dell'attributo ProductModelID usando il metodo value().

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

Nell'esempio seguente il risultato della FOR XML query viene restituito come xml tipo, perché la TYPE direttiva viene specificata nella FOR XML clausola .

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

Risultato:

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

Poiché il risultato è di xml tipo, è possibile specificare uno dei metodi del xml tipo di dati direttamente su questo XML, come illustrato nella query seguente. Nella query viene utilizzato il metodo query() (tipo di dati xml) per recuperare il primo <row> elemento figlio dell'elemento <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]');  
  

Risultato:

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

Restituzione dei risultati delle query FOR XML interne alle query esterne come istanze di tipo xml

È possibile scrivere query nidificate FOR XML in cui il risultato della query interna viene restituito come tipo xml nella query esterna. Per esempio:

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

Nota quanto segue dalla query precedente:

  • Il valore XML generato dalla query FOR XML interna viene aggiunto al valore XML generato dalla query FOR XMLesterna.

  • Nella query interna viene specificata la direttiva TYPE . Di conseguenza, i dati XML restituiti dalla query interna sono di xml tipo . Se la direttiva TYPE non viene specificata, il risultato della query interna FOR XML viene restituito come nvarchar(max) e i dati XML vengono entitàzati.

Controllo della forma dei dati XML risultanti

Le query FOR XML nidificate consentono di avere un maggior controllo nella definizione della forma dei dati XML risultanti. È possibile utilizzare query FOR XML nidificate per costruire XML che sia parzialmente incentrato sugli attributi e parzialmente sugli elementi.

Per ulteriori informazioni su come specificare XML incentrato sia sugli attributi sia sugli elementi con query FOR XML nidificate, vedere Query FOR XML e query nidificata FOR XML a confronto e Strutturare XML con query nidificate FOR XML.

È possibile generare gerarchie XML che includono elementi di pari livello eseguendo query FOR XML nidificate in modalità AUTO. Per altre informazioni, vedere Generare fratelli tramite query nidificate in modalità AUTO.

Indipendentemente dalla modalità utilizzata, le query FOR XML nidificate offrono un maggior controllo nella descrizione della struttura dell'XML risultante. e possono essere utilizzate in sostituzione delle query in modalità EXPLICIT.

Esempi

Negli argomenti seguenti vengono forniti esempi di query FOR XML nidificate.

Confronto tra Query FOR XML e Query FOR XML annidate
Confronta una query FOR XML a un unico livello con una query FOR XML nidificata. In questo esempio è inclusa una dimostrazione di come specificare valori XML incentrati sia sugli attributi sia sugli elementi come risultato della query.

Generare elementi di pari livello tramite query annidate in modalità AUTO
Come generare nodi correlati utilizzando una query nidificata in modalità AUTO

Usare le query annidate FOR XML in ASP.NET
Dimostrazione del modo in cui un'applicazione ASPX può utilizzare FOR XML per restituire XML da SQL Server.

Determinare la struttura dei valori XML tramite query FOR XML annidate
Mostra come utilizzare query FOR XML nidificate per controllare la struttura di un documento XML creato da SQL Server.