Supporto del tipo di dati xml in FOR XMLFOR XML Support for the xml Data Type

Se nella clausola SELECT di una query FOR XML è specificata una colonna di tipo xml , viene eseguito il mapping dei valori della colonna come elementi nel codice XML risultante, indipendentemente dal fatto che sia stata specificata o meno la direttiva ELEMENTS.If a FOR XML query specifies a column of xml type in the SELECT clause, column values are mapped as elements in the returned XML, regardless of whether you specify the ELEMENTS directive. Le dichiarazioni XML nella colonna di tipo xml non sono serializzate.Any XML declaration in the xml type column is not serialized.

Ad esempio, la query seguente recupera le informazioni di contatto del cliente, quali le colonne BusinessEntityID, FirstNamee LastName , e i numeri di telefono dalla colonna AdditionalContactInfo di tipo xml .For example, the following query retrieves customer contact information such as the BusinessEntityID, FirstName, and LastName columns, and the telephone numbers from the AdditionalContactInfo column of xml type.

USE AdventureWorks2012;  
GO  
SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
 //act:telephoneNumber/act:number  
') AS PhoneNumber  
FROM Person.Person  
WHERE AdditionalContactInfo.query('  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
 //act:telephoneNumber/act:number  
')IS NOT NULL  
FOR XML AUTO, TYPE;  

Poiché nella query non è specificata la direttiva ELEMENTS, i valori di colonna vengono restituiti come attributi, ad eccezione delle informazioni aggiuntive sui contatti recuperate dalla colonna di tipo xml ,Because the query does not specify the ELEMENTS directive, the column values are returned as attributes, except for the additional contact information values retrieved from the xml type column. che vengono restituite come elementi.These are returned as elements.

Risultato parziale:This is the partial result:

<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">

<PhoneNumber>

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

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

</PhoneNumber>

</Person.Person>

<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">

<PhoneNumber>

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

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

</PhoneNumber>

</Person.Person>  
...  

Se si specifica un alias di colonna per la colonna XML generata da XQuery, tale alias consente di aggiungere un elemento wrapper intorno al codice XML generato da XQuery.If you specify a column alias for the XML column generated by the XQuery, that alias is used to add a wrapper element around the XML generated by the XQuery. Ad esempio, la query seguente specifica MorePhoneNumbers come alias di colonna:For example, the following query specifies MorePhoneNumbers as a column alias:

SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
 //act:telephoneNumber/act:number  
') AS PhoneNumber  
FROM Person.Person  
WHERE AdditionalContactInfo.query('  
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
 //act:telephoneNumber/act:number  
')IS NOT NULL  
FOR XML AUTO, TYPE;  

Il codice XML restituito da XQuery viene inserito nell'elemento <MorePhoneNumbers>, come illustrato nel risultato parziale seguente:The XML returned by the XQuery is wrapped in the <MorePhoneNumbers> element, as shown in the following partial result:

<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">

<MorePhoneNumbers>

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

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

</MorePhoneNumbers>

</Person.Person>

<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">

<MorePhoneNumbers>

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

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

</MorePhoneNumbers>

</Person.Person>  
...  

Se si specifica la direttiva ELEMENTS nella query, BusinessEntityID, LastName e FirstName verranno restituiti come elementi nel codice XML risultante.If you specify the ELEMENTS directive in the query, the BusinessEntityID, LastName, and FirstName will be returned as elements in the resulting XML.

Nell'esempio seguente viene dimostrato che, in base alla logica di elaborazione di FOR XML, le dichiarazioni XML contenute nei dati XML di una colonna di tipo xml non vengono serializzate:The following example illustrates that the FOR XML processing logic does not serialize any XML declarations in the XML data from an xml type column:

create table t(i int, x xml)  
go  
insert into t values(1, '<?xml version="1.0" encoding="UTF-8" ?>  
                             <Root SomeID="10" />')  
select i, x  
from   t  
for xml auto;  

Di seguito è riportato il risultato.This is the result. Nel risultato la dichiarazione XML <?xml version="1.0" encoding="UTF-8" ?> non è serializzata.In the result, the XML declaration <?xml version="1.0" encoding="UTF-8" ?> is not serialized.

<root>  
  <t i="1">  
    <x>  
      <Root SomeID="10" />  
    </x>  
  </t>  
</root>  

Restituzione di codice XML da una funzione definita dall'utenteReturning XML from a User-defined Function

Le query FOR XML consentono di restituire codice XML da una funzione definita dall'utente che restituisce quanto segue:FOR XML queries can be used for returning XML from a user-defined function that returns either of the following:

  • Una tabella con una singola colonna di tipo xmlA table with a single xml type column

  • Un'istanza di tipo xmlAn instance of the xml type

    Ad esempio, la funzione definita dall'utente seguente restituisce una tabella con una singola colonna di tipo xml:For example, the following user-defined function returns a table with a single column of xml type:

USE AdventureWorks2012;  
GO  
CREATE FUNCTION dbo.MyUDF (@ProudctModelID int)  
RETURNS @T TABLE  
  (  
     ProductDescription xml  
  )  
AS  
BEGIN  
  INSERT @T  
     SELECT CatalogDescription.query('  
declare namespace PD="http://www.adventure-works.com/schemas/products/description";  
                    //PD:ProductDescription  ')  
     FROM Production.ProductModel  
     WHERE ProductModelID = @ProudctModelID  
  RETURN  
END;  

È possibile eseguire la funzione definita dall'utente ed eseguire una query sulla tabella restituita dalla funzione.You can execute the user-defined function and query the table returned by it. In questo esempio, il codice XML restituito dalla query eseguita sulla tabella viene assegnato a una variabile di tipo xml .In this example, the XML returned by querying the table is assigned to an xml type variable.

declare @x xml;  
set @x = (SELECT * FROM MyUDF(19));  
select @x;  

Di seguito è riportato un altro esempio di una funzione definita dall'utente,This is another example of a user-defined function. che restituisce un'istanza del tipo xml .This user-defined function returns an instance of the xml type. Nell'esempio la funzione definita dall'utente restituisce un'istanza di tipo XML perché è specificato lo spazio dei nomi dello schema.In this example, the user-defined function returns a typed XML instance, because the schema namespace is specified.

DROP FUNCTION dbo.MyUDF;  
GO  
CREATE FUNCTION MyUDF (@ProductModelID int)   
RETURNS xml ([Production].[ProductDescriptionSchemaCollection])  
AS  
BEGIN  
  declare @x xml  
  set @x =   ( SELECT CatalogDescription  
          FROM Production.ProductModel  
          WHERE ProductModelID = @ProductModelID )  
  return @x  
END;  

Il codice XML restituito dalla funzione definita dall'utente può quindi essere assegnato a una variabile di tipo xml , come illustrato nell'esempio seguente:The XML returned by the user-defined function can be assigned to an xml type variable as follows:

declare @x xml;  
SELECT @x= dbo.MyUDF4 (19) ;  
select @x;  

Vedere ancheSee Also

Supporto di FOR XML per vari tipi di dati di SQL ServerFOR XML Support for Various SQL Server Data Types