Direttiva TYPE in query FOR XMLTYPE Directive in FOR XML Queries

Il supporto di SQL ServerSQL Server per xml (Transact-SQL) consente di richiedere facoltativamente che il risultato di una query FOR XML venga restituito come tipo di dati xml specificando la direttiva TYPE. SQL ServerSQL Server support for the xml (Transact-SQL) enables you to optionally request that the result of a FOR XML query be returned as xml data type by specifying the TYPE directive. In questo modo è possibile elaborare il risultato di una query FOR XML sul server.This allows you to process the result of a FOR XML query on the server. Ad esempio, è possibile specificare un'espressione XQuery per la query FOR XML, assegnare il risultato a una variabile di tipo xml oppure scrivere query FOR XML annidate.For example, you can specify an XQuery against it, assign the result to an xml type variable, or write Nested FOR XML queries.

Nota

SQL ServerSQL Server restituisce dati di istanza di tipo XML al client come risultato di diversi costrutti server, ad esempio query FOR XML che usano la direttiva TYPE o in cui il tipo di dati xml viene usato per la restituzione di valori dei dati dell'istanza XML da colonne di tabella e parametri di output SQL. returns XML data type instance data to the client as a result of different server-constructs such as FOR XML queries that use the TYPE directive, or where the xml data type is used to return XML instance data values from SQL table columns and output parameters. Nel codice delle applicazioni client, il provider ADO.NET richiede che le informazioni sui tipi di dati XML vengano inviate dal server in codifica binaria.In client application code, the ADO.NET provider requests this XML data type information to be sent in a binary encoding from the server. Se tuttavia si utilizza FOR XML senza la direttiva TYPE, i dati XML vengono restituiti come tipo stringa.However, if you are using FOR XML without the TYPE directive, the XML data comes back as a string type. In tutti i casi, il provider client sarà sempre in grado di gestire entrambe i formati di XML.In any case, the client provider will always be able to handle either form of XML. La clausola FOR XML di livello principale senza la direttiva TYPE non può essere utilizzata con i cursori.Note that top-level FOR XML without the TYPE directive cannot be used with cursors.

EsempiExamples

Nell'esempio seguente viene illustrato l'utilizzo della direttiva TYPE con le query FOR XML.The following examples illustrate the use of the TYPE directive with FOR XML queries.

Recupero dei risultati di una query FOR XML come tipo xmlRetrieving FOR XML query results as xml type

La query seguente recupera le informazioni di contatto del cliente dalla tabella Contacts .The following query retrieves customer contact information from the Contacts table. Poiché la direttiva TYPE è specificata in FOR XML, il risultato viene restituito come tipo xml .Because the TYPE directive is specified in FOR XML, the result is returned as xml type.

USE AdventureWorks2012;  
Go  
SELECT BusinessEntityID, FirstName, LastName  
FROM Person.Person  
ORDER BY BusinessEntityID  
FOR XML AUTO, TYPE;  

Risultato parziale:This is the partial result:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>

<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>

...

Assegnazione dei risultati di una query FOR XML a una variabile di tipo xmlAssigning FOR XML query results to an xml type variable

Nell'esempio seguente un risultato FOR XML è assegnato a una variabile di tipo xml , @x.In the following example, a FOR XML result is assigned to an xml type variable, @x. La query recupera le informazioni di contatto, ad esempio BusinessEntityID, FirstName, LastName, e i numeri di telefono aggiuntivi dalla colonna AdditionalContactInfo di tipo xmlTYPE.The query retrieves contact information, such as the BusinessEntityID, FirstName, LastName, and additional telephone numbers, from the AdditionalContactInfo column of xmlTYPE. Poiché la clausola FOR XML specifica la direttiva TYPE , il codice XML viene restituito come tipo xml e assegnato a una variabile.Because the FOR XML clause specifies TYPE directive, the XML is returned as xml type and is assigned to a variable.

USE AdventureWorks2012;  
GO  
DECLARE @x xml;  
SET @x = (  
   SELECT BusinessEntityID,   
          FirstName,   
          LastName,   
          AdditionalContactInfo.query('  
declare namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
              //act:telephoneNumber/act:number') as MorePhoneNumbers  
   FROM Person.Person  
   FOR XML AUTO, TYPE);  
SELECT @x;  
GO  

Esecuzione di una query sui risultati di una query FOR XMLQuerying results of a FOR XML query

La query FOR XML restituisce codice XML.The FOR XML queries return XML. È quindi possibile applicare i metodi con tipo xml , ad esempio query() e value(), al risultato XML restituito dalle query FOR XML.Therefore, you can apply xml type methods, such as query() and value(), to the XML result returned by FOR XML queries.

Nella query seguente il metodo query() del tipo di dati xml viene usato per l'esecuzione di una query sui risultati della query FOR XML.In the following query, the query() method of the xml data type is used to query the result of the FOR XML query. Per altre informazioni, vedere Metodo query() con tipo di dati XML.For more information, see query() Method (xml Data Type).

USE AdventureWorks2012;  
GO  
SELECT (SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('  
DECLARE namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
DECLARE namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
 //act:telephoneNumber/act:number  
') AS PhoneNumbers  
FROM Person.Person  
FOR XML AUTO, TYPE).query('/Person.Person[1]');  

La query interna SELECT … FOR XML restituisce un risultato di tipo xml al quale la query esterna SELECT applica il metodo query() per il tipo xml.The inner SELECT … FOR XML query returns an xml type result to which the outer SELECT applies the query() method to the xml type. Si noti la direttiva TYPE specificata.Note the TYPE directive specified.

Risultato:This is the result:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">

<PhoneNumbers>

<act:number xmlns:act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>

<act:number xmlns:act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>

</PhoneNumbers>

</Person.Person>

Nella query seguente il metodo value() con il tipo di dati xml viene usato per recuperare un valore dal risultato XML restituito dalla query SELECT…FOR XML.In the following query, the value() method of the xml data type is used to retrieve a value from the XML result returned by the SELECT…FOR XML query. Per altre informazioni, vedere Metodo value() (tipo di dati XML).For more information, see value() Method (xml Data Type).

USE AdventureWorks2012;  
GO  
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);  
SELECT @FirstPhoneFromAdditionalContactInfo =   
 ( SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('  
declare namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
   //act:telephoneNumber/act:number  
   ') AS PhoneNumbers  
   FROM Person.Person Contact  
   FOR XML AUTO, TYPE).value('  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
  /Contact[@BusinessEntityID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'  
 )  
SELECT @FirstPhoneFromAdditionalContactInfo;  

L'espressione di percorso XQuery nel metodo value() recupera il primo numero di telefono di un cliente il cui BusinessEntityID è 1.The XQuery path expression in the value() method retrieves the first telephone number of a customer contact whose BusinessEntityID is 1.

Nota

Se non si specifica la direttiva TYPE, il risultato della query FOR XML viene restituito come tipo nvarchar(max).If the TYPE directive is not specified, the FOR XML query result is returned as type nvarchar(max).

Utilizzo dei risultati di query FOR XML in istruzioni INSERT, UPDATE e DELETE (DML Transact-SQL)Using FOR XML query results in INSERT, UPDATE, and DELETE (Transact-SQL DML)

Nell'esempio seguente viene illustrato l'utilizzo delle query FOR XML nelle istruzioni DML (Data Manipulation Language).The following example demonstrates how FOR XML queries can be used in Data Manipulation Language (DML) statements. Nell'esempio la query FOR XML restituisce un'istanza di tipo xml .In the example, the FOR XML returns an instance of xml type. L'istruzione INSERT inserisce il codice XML in una tabella.The INSERT statement inserts this XML into a table.

CREATE TABLE T1(intCol int, XmlCol xml);  
GO  
INSERT INTO T1   
VALUES(1, '<Root><ProductDescription ProductModelID="1" /></Root>');  
GO  

CREATE TABLE T2(XmlCol xml)  
GO  
INSERT INTO T2(XmlCol)   
SELECT (SELECT XmlCol.query('/Root')   
        FROM T1   
        FOR XML AUTO,TYPE);   
GO  

Vedere ancheSee Also

FOR XML (SQL Server)FOR XML (SQL Server)