Utilizzo di query FOR XML nidificateUse Nested FOR XML Queries

Il tipo di dati xml e la direttiva TYPE nelle query FOR XML l'elaborazione dell'XML restituito dalle query FOR XML sia sul server che sul client.The xml data type and the TYPE directive in FOR XML queries enable the XML returned by the FOR XML queries to be processed on the server as well as on the client.

Elaborazione con variabili di tipo XMLProcessing with xml Type Variables

È possibile assegnare il risultato di una query FOR XML a una variabile di tipo xml oppure usare XQuery per eseguire query sul risultato e quindi assegnare tale risultato a una variabile di tipo xml per un'ulteriore elaborazione.You can assign the FOR XML query result to an xml type variable, or use XQuery to query the result, and assign that result to an xml type variable for more processing.

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

Il valore XML restituito nella variabile @xpuò essere ulteriormente elaborato usando uno dei metodi con tipo di dati xml .You can additionally process the XML returned in the variable, @x, by using one of the xml data type methods. Ad esempio, è possibile recuperare il valore dell'attributo ProductModelID usando il metodo value().For example, you can retrieve the ProductModelID attribute value by using the value() method.

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

Nell'esempio seguente, il risultato della query FOR XML viene restituito come tipo xml a causa della direttiva TYPE specificata nella clausola FOR XML .In the following example, the FOR XML query result is returned as an xml type, because the TYPE directive is specified in the FOR XML clause.

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

Risultato:This is the result:

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

Poiché il risultato è di tipo xml, è possibile applicare uno dei metodi con tipo di dati xml direttamente al valore XML, come illustrato nella query seguente.Because the result is of xml type, you can specify one of the xml data type methods directly against this XML, as shown in the following query. Nella query viene usato il metodo query() con tipo di dati XML per recuperare il primo elemento <row> figlio dell'elemento <myRoot>.In the query, the query() method (xml Data Type) is used to retrieve the first <row> element child of the <myRoot> element.

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:This is the result:

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

Restituzione di risultati della query FOR XML interna a query esterne come istanze di tipo XMLReturning Inner FOR XML Query Results to Outer Queries as xml Type Instances

È possibile scrivere query FOR XML nidificate in cui il risultato della query interna viene restituito alla query esterna come tipo di dati xml .You can write nested FOR XML queries where the result of the inner query is returned as an xml type to the outer query. Esempio:For example:

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

Dalla query precedente si noti quanto segue:Note the following from the previous query:

  • Il valore XML generato dalla query FOR XML interna viene aggiunto al valore XML generato dalla query FOR XMLesterna.The XML generated by the inner FOR XML query is added to the XML generated by the outer FOR XML.

  • Nella query interna viene specificata la direttiva TYPE .The inner query specifies the TYPE directive. I dati restituiti dalla query interna sono quindi di tipo xml .Therefore, the XML data returned by the inner query is of xml type. Se non si specifica la direttiva TYPE, il risultato della query FOR XML interna viene restituito come nvarchar(max) e i dati XML vengono sostituiti con entità.If the TYPE directive is not specified, the result of the inner FOR XML query is returned as nvarchar(max) and the XML data is entitized.

Controllo della forma dei dati XML risultantiControlling the Shape of Resulting XML Data

Le query FOR XML nidificate consentono di avere un maggior controllo nella definizione della forma dei dati XML risultanti.Nested FOR XML queries give you more control in defining the shape of the resulting XML data. È possibile utilizzare query FOR XML nidificate per costruire valori XML che siano parzialmente incentrati sugli attributi e parzialmente sugli elementi.You can use nested FOR XML queries to construct XML that is partly attribute-centric and partly element-centric.

Per altre informazioni su come specificare valori XML incentrati sia sugli attributi sia sugli elementi con query FOR XML nidificate, vedere Query FOR XML e query nidificata FOR XML a confronto e Determinare la struttura dei valori XML tramite query nidificate FOR XML.For more information about specifying both attribute-centric and element-centric XML with nested FOR XML queries, see FOR XML Query Compared to Nested FOR XML Query and Shape XML with Nested FOR XML Queries.

È possibile generare gerarchie XML che includono elementi di pari livello eseguendo query FOR XML nidificate in modalità AUTO.You can generate XML hierarchies that include siblings by specifying nested AUTO mode FOR XML queries. Per altre informazioni, vedere Generare elementi di pari livello tramite query nidificate in modalità AUTO.For more information, see Generate Siblings with a Nested AUTO Mode Query.

Indipendentemente dalla modalità utilizzata, le query FOR XML nidificate consentono un maggior controllo nella definizione della forma dei valori XML risultantiRegardless of which mode you use, nested FOR XML queries provide more control in describing the shape of the resulting XML. e possono essere utilizzate in sostituzione delle query in modalità EXPLICIT.They can be used in the place of EXPLICIT mode queries.

EsempiExamples

Negli argomenti seguenti vengono forniti esempi di query FOR XML nidificate.The following topics provide examples of nested FOR XML queries.

Query FOR XML e query nidificata FOR XML a confrontoFOR XML Query Compared to Nested FOR XML Query
Confronto di una query FOR XML con un solo livello con una query FOR XML nidificata.Compares a single-level FOR XML query to a nested FOR XML query. In questo esempio è inclusa una dimostrazione di come specificare valori XML incentrati sia sugli attributi sia sugli elementi come risultato della query.This example includes a demonstration of how to specify both attribute-centric and element-centric XML as the result of the query.

Generare elementi di pari livello tramite query nidificate in modalità AUTOGenerate Siblings with a Nested AUTO Mode Query
Procedura di generazione di elementi di pari livello tramite query nidificate in modalità AUTOShows how to generate siblings by using a nested AUTO mode query

Utilizzo di query FOR XML nidificate in ASP.NETUse Nested FOR XML Queries in ASP.NET
Dimostrazione del modo in cui un'applicazione ASPX può utilizzare FOR XML per restituire XML da SQL ServerSQL Server.Demonstrates how an ASPX application can use FOR XML to return XML from SQL ServerSQL Server.

Determinare la struttura dei valori XML tramite query nidificate FOR XMLShape XML with Nested FOR XML Queries
Utilizzo di query FOR XML nidificate per controllare la struttura di un documento XML creato da SQL ServerSQL Server.Shows how to use nested FOR XML queries to control the structure of an XML document created by SQL ServerSQL Server.