Creare istanze di dati XMLCreate Instances of XML Data

In questo argomento viene descritto come generare istanze XML.This topic describes how to generate XML instances.

In SQL ServerSQL Serverè possibile generare istanze XML tramite i metodi seguenti:In SQL ServerSQL Server, you can generate XML instances in the following ways:

  • Cast dei tipi delle istanze di dati di tipo stringa.Type casting string instances.

  • Utilizzo dell'istruzione SELECT con la clausola FOR XML.Using the SELECT statement with the FOR XML clause.

  • Utilizzo di assegnazioni di costanti.Using constant assignments.

  • Utilizzo del caricamento bulk.Using bulk load.

Cast di tipo di istanze binarie e di stringaType Casting String and Binary Instances

È possibile analizzare qualsiasi tipo di dati stringa di SQL ServerSQL Server , ad esempio [n][var]char, [n]text, varbinarye image, nel tipo di dati xml eseguendo il cast o la conversione della stringa (rispettivamente tramite l'istruzione CAST o CONVERT) nel tipo di dati xml .You can parse any of the SQL ServerSQL Server string data types, such as [n][var]char, [n]text, varbinary,and image, into the xml data type by casting (CAST) or converting (CONVERT) the string to the xml data type. L'istanza XML non tipizzata viene controllata per verificare che il formato sia corretto.Untyped XML is checked to confirm that it is well formed. Se al tipo xml è associato uno schema, viene eseguita anche la convalida.If there is a schema associated with the xml type, validation is also performed. Per altre informazioni, vedere Confrontare dati XML tipizzati con dati XML non tipizzati.For more information, see Compare Typed XML to Untyped XML.

I documenti XML possono essere codificati con codifiche diverse, ad esempio UTF-8, UTF-16, windows-1252).XML documents can be encoded with different encodings (for example, UTF-8, UTF-16, windows-1252). Di seguito vengono descritte le regole in base alle quali i tipi di origine di stringa e binari interagiscono con la codifica del documento XML, nonché il comportamento del parser.The following outlines the rules on how the string and binary source types interact with the XML document encoding and how the parser behaves.

Dato che nvarchar presuppone una codifica unicode a 2 byte come UTF-16 o UCS-2, il parser XML tratterà il valore stringa come un documento o frammento XML codificato Unicode a 2 byte.Since nvarchar assumes a two-byte unicode encoding such as UTF-16 or UCS-2, the XML parser will treat the string value as a two-byte Unicode encoded XML document or fragment. Questo significa che anche il documento XML dovrà essere codificato tramite codifica Unicode a 2 byte per essere compatibile con il tipo di dati di origine.This means that the XML document needs to be encoded in a two-byte Unicode encoding as well to be compatible with the source data type. Un documento XML con codifica UTF-16 potrà, ma non dovrà obbligatoriamente, includere un indicatore dell'ordine dei byte (BOM) UTF-16, in quanto il contesto del tipo di origine chiarisce che può trattarsi solo di un documento con codifica Unicode a 2 byte.A UTF-16 encoded XML document can have a UTF-16 byte order mark (BOM), but it does not need to, since the context of the source type makes it clear that it can only be a two-byte Unicode encoded document.

Il contenuto di una stringa varchar viene trattato come documento/frammento XML con codifica a 1 byte da parte del parser XML.The content of a varchar string is treated as a one-byte encoded XML document/fragment by the XML parser. Dato che alla stringa di origine varchar è associata una tabella codici, il parser la utilizzerà per la codifica se non nel documento XML non viene specificata alcuna codifica. Se un'istanza XML include un BOM o una dichiarazione di codifica, quest'ultima deve essere consistente con la tabella codici, altrimenti il parser genererà un errore.Since the varchar source string has a code page associated, the parser will use that code page for the encoding if no explicit encoding is specified in the XML itself If an XML instance has a BOM or an encoding declaration, the BOM or declaration needs to be consistent with the code page, otherwise the parser will report an error.

Il contenuto di varbinary viene trattato come flusso di punti di codice passato direttamente al parser XML.The content of varbinary is treated as a codepoint stream that is passed directly to the XML parser. Di conseguenza, il documento o frammento XML deve specificare il BOM o altra informazione sulla codifica inline.Thus, the XML document or fragment needs to provide the BOM or other encoding information inline. Il parser esaminerà solo il flusso per determinare la codifica.The parser will only look at the stream to determine the encoding. Questo significa che il documento XML con codifica UTF-16 deve specificare il BOM UTF-16 e che un'istanza senza BOM e senza dichiarazione di codifica verrà interpretata come UTF-8.This means that UTF-16 encoded XML needs to provide the UTF-16 BOM and an instance without BOM and without a declaration encoding will be interpreted as UTF-8.

Se la codifica del documento XML non è già nota e i dati vengono passati dati di tipo stringa o binari anziché come dati XML prima che venga eseguito il cast sull'XML, è consigliabile trattare i dati come varbinary.If the encoding of the XML document is not known in advance and the data is passed as string or binary data instead of XML data before casting to XML, it is recommended to treat the data as varbinary. Ad esempio, nella lettura dei dati da un file XML utilizzando OpenRowset(), specificare i dati da leggere come valore varbinary(max) :For example, when reading data from an XML file using OpenRowset(), one should specify the data to be read as a varbinary(max) value:

select CAST(x as XML)   
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)  

SQL ServerSQL Server offre internamente una rappresentazione binaria efficiente dell'istanza XML, basata sulla codifica UTF-16. internally represents XML in an efficient binary representation that uses UTF-16 encoding. La codifica specificata dall'utente non viene mantenuta, ma viene considerata durante il processo di analisi.User-provided encoding is not preserved, but is considered during the parse process.

Cast di tipo di tipi CLR definiti dall'utenteType Casting CLR user-defined types

Se un tipo CLR definito dall'utente include una serializzazione XML, per le istanze di tale tipo è possibile eseguire il cast in modo esplicito su un tipo di dati XML.If a CLR user-defined type has an XML Serialization, instances of that type can be explicitly cast to an XML datatype. Per altri dettagli sulla serializzazione XML di un tipo CLR definito dall'utente, vedere Serializzazione XML da oggetti di database CLR.For more details about the XML serialization of a CLR user-defined typed, see XML Serialization from CLR Database Objects.

Gestione degli spazi vuoti nell'istanza XML tipizzataWhite Space Handling in Typed XML

In SQL ServerSQL Server, gli spazi vuoti all'interno del contenuto degli elementi vengono considerati non significativi se ricorrono in una sequenza di dati di tipo carattere composti solo da spazi vuoti delimitati da markup, ad esempio tag di inizio e di fine, e non vengono sostituiti con entità.In SQL ServerSQL Server, white space inside element content is considered insignificant if it occurs inside a sequence of white-space-only character data delimited by markup, such as begin or end tags, and is not entitized. Le sezioni CDATA vengono ignorate. Questa modalità di gestione degli spazi vuoti è diversa da quella descritta nella specifica XML 1.0 pubblicata dal World Wide Web Consortium (W3C).(CDATA sections are ignored.) This handling of white space handling is different from how white space is described in the XML 1.0 specification published by the World Wide Web Consortium (W3C). Tale differenza è dovuta al fatto che il parser XML in SQL ServerSQL Server riconosce solo un numero limitato di subset DTD, come definito nella specifica XML 1.0.This is because the XML parser in SQL ServerSQL Server recognizes only a limited number of DTD subsets, as defined in XML 1.0. Per altre informazioni sul numero limitato di subset DTD supportati in SQL ServerSQL Server, vedere CAST e CONVERT (Transact-SQL).For more information about the limited DTD subsets supported in SQL ServerSQL Server, see CAST and CONVERT (Transact-SQL).

Per impostazione predefinita, il parser XML elimina gli spazi vuoti durante la conversione di dati di tipo stringa nel formato XML in uno dei casi seguenti:By default, the XML parser discards insignificant white space when it converts string data to XML if either of the following is true:

  • The xml:space l'attributo non viene definito per un elemento o i relativi predecessori.The xml:space attribute is not defined on an element or its ancestor elements.

  • Viene assegnato il valore predefinito all'attributo xml:space attivo per un elemento o i relativi predecessori.The xml:space attribute in effect on an element, or one of its ancestor elements, has the value of default.

    Esempio:For example:

declare @x xml  
set @x = '<root>      <child/>     </root>'  
select @x   

Risultato:This is the result:

<root><child/></root>  

È tuttavia possibile modificare tale impostazione.However, you can change this behavior. Per mantenere gli spazi vuoti in un'istanza XML DT, è possibile utilizzare l'operatore CONVERT e il parametro facoltativo style corrispondente impostato sul valore 1.To preserve white space for an xml DT instance, use the CONVERT operator and its optional style parameter set to a value of 1. Esempio:For example:

SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1)  

Se il parametro style non viene utilizzato o è impostato sul valore 0, gli spazi vuoti non significativi non vengono mantenuti per la conversione dell'istanza XML DT.If the style parameter is either not used or its value is set to 0, insignificant white space is not preserved for the conversion of the xml DT instance. Per altre informazioni sull'uso dell'operatore CONVERT e del parametro style durante la conversione di dati di tipo stringa in istanze XML DT, vedere CAST e CONVERT (Transact-SQL).For more information about how to use the CONVERT operator and its style parameter when converting string data to xml DT instances, see CAST and CONVERT (Transact-SQL).

Esempio: cast di un valore stringa al tipo XML tipizzato e assegnazione a una colonnaExample: Cast a string value to typed xml and assign it to a column

Nell'esempio seguente viene eseguito il cast di una variabile stringa contenente un frammento XML al tipo di dati xml e quindi viene archiviata tale variabile nella colonna di tipo xml :The following example casts a string variable that contains an XML fragment to the xml data type and then stores it in the xml type column:

CREATE TABLE T(c1 int primary key, c2 xml)  
go  
DECLARE  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   

L'operazione di inserimento seguente converte in modo implicito una stringa nel tipo di dati xml :The following insert operation implicitly converts from a string to the xml type:

INSERT INTO T VALUES (3, @s)   

È possibile utilizzare cast() per eseguire il cast esplicito della stringa al tipo xml :You can explicitly cast() the string to the xml type:

INSERT INTO T VALUES (3, cast (@s as xml))  

In alternativa, è possibile utilizzare convert(), come illustrato nell'esempio seguente:Or you can use convert(), as shown in the following:

INSERT INTO T VALUES (3, convert (xml, @s))   

Esempio: conversione di una stringa nel tipo XML tipizzato e assegnazione a una variabileExample: Convert a string to typed xml and assign it to a variable

Nell'esempio seguente, una stringa viene convertita nel tipo xml e assegnata a una variabile con tipo di dati xml :In the following example, a string is converted to xml type and assigned to a variable of the xml data type:

declare @x xml  
declare  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
set @x =convert (xml, @s)  
select @x  

Utilizzo dell'istruzione SELECT con la clausola FOR XMLUsing the SELECT Statement with a FOR XML Clause

È possibile utilizzare la clausola FOR XML in un'istruzione SELECT per restituire i risultati in formato XML.You can use the FOR XML clause in a SELECT statement to return results as XML. Esempio:For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = (SELECT Column1, Column2  
               FROM   Table1, Table2  
               WHERE   Some condition  
               FOR XML AUTO)  
 ...  

L'istruzione SELECT restituisce un frammento di testo XML che viene quindi analizzato durante l'assegnazione alla variabile con tipo di dati xml .The SELECT statement returns a textual XML fragment that is then parsed during the assignment to the xml data type variable.

Nella clausola FOR XML, è inoltre possibile utilizzare la direttiva TYPE che restituisce direttamente il risultato di una query FOR XML come tipo xml :You can also use the TYPE directive in the FOR XML clause that directly returns a FOR XML query result as xml type:

Declare @xmlDoc xml  
SET @xmlDoc = (SELECT ProductModelID, Name  
               FROM   Production.ProductModel  
               WHERE  ProductModelID=19  
               FOR XML AUTO, TYPE)  
SELECT @xmlDoc  

Risultato:This is the result:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...  

Nell'esempio seguente, il risultato xml tipizzato di una query FOR XML viene inserito in una colonna di tipo xml:In the following example, the typed xml result of a FOR XML query is inserted into an xml type column:

CREATE TABLE T1 (c1 int, c2 xml)  
go  
INSERT T1(c1, c2)  
SELECT 1, (SELECT ProductModelID, Name  
           FROM Production.ProductModel  
           WHERE ProductModelID=19  
           FOR XML AUTO, TYPE)  
SELECT * FROM T1  
go  

Per altre informazioni su FOR XML, vedere FOR XML (SQL Server).For more information about FOR XML, see FOR XML (SQL Server).

Nota

SQL ServerSQL Server restituisce al client istanze con tipo di dati xml come risultato di diversi costrutti server, quali query FOR XML che utilizzano la direttiva TYPE, o nel caso in cui il tipo di dati xml venga utilizzato per restituire il codice XML da colonne SQL, variabili o parametri di output. SQL ServerSQL Server returns xml data type instances 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 from SQL columns, variables, and output parameters. Nel codice dell'applicazione client il provider ADO.NET richiede che queste informazioni con tipo di dati xml siano inviate dal server utilizzando una codifica binaria.In client application code, the ADO.NET provider requests that this xml data type information 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 string.However, if you are using FOR XML without the TYPE directive, the XML data returns 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.

Utilizzo di assegnazioni di costantiUsing Constant Assignments

È possibile utilizzare una costante stringa nei casi in cui è prevista un'istanza con tipo di dati xml .A string constant can be used where an instance of the xml data type is expected. Tale operazione è equivalente a un CAST implicito della stringa al formato XML.This is the same as an implied CAST of string to XML. Esempio:For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
-- Or  
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>'  

Nell'esempio precedente, la stringa viene convertita in modo implicito nel tipo di dati xml e assegnata a una variabile di tipo xml .The previous example implicitly converts the string to the xml data type and assigns it to an xml type variable.

Nell'esempio seguente viene inserita una stringa costante in una colonna di tipo xml :The following example inserts a constant string into an xml type column:

CREATE TABLE T(c1 int primary key, c2 xml)  
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>')   

Nota

L'istanza XML tipizzata viene convalidata in base allo schema specificato.For typed XML, the XML is validated against the specified schema. Per altre informazioni, vedere Confrontare dati XML tipizzati con dati XML non tipizzati.For more information, see Compare Typed XML to Untyped XML.

Utilizzo del caricamento bulkUsing Bulk Load

La funzionalità avanzata OPENROWSET (Transact-SQL) consente di eseguire il caricamento bulk dei documenti XML nel database.The enhanced OPENROWSET (Transact-SQL) functionality allows you to bulk load XML documents in the database. È possibile eseguire un caricamento bulk delle istanze XML dai file nelle colonne di tipo xml del database.You can bulk load XML instances from files into the xml type columns in the database. Per esempi funzionanti, vedere Esempi di importazione ed esportazione bulk di documenti XML (SQL Server).For working samples, see Examples of Bulk Import and Export of XML Documents (SQL Server). Per altre informazioni sul caricamento dei documenti XML, vedere Caricare dati XML.For more information about loading XML documents, see Load XML Data.

Argomenti della sezioneIn This Section

ArgomentoTopic DescrizioneDescription
Recuperare ed eseguire query su dati XMLRetrieve and Query XML Data Descrizione delle parti di istanze XML che non sono mantenute quando vengono archiviate nei database.Describes the parts of XML instances that are not preserved when they are stored in databases.

Vedere ancheSee Also

Confrontare dati XML tipizzati con dati XML non tipizzati Compare Typed XML to Untyped XML
Metodi con tipo di dati XML xml Data Type Methods
Linguaggio XML di manipolazione dei dati (XML DML) XML Data Modification Language (XML DML)
Dati XML (SQL Server) XML Data (SQL Server)