Share via


Generazione di istanze XML

Come descritto in Tipo di dati XML, è possibile archiviare le istanze XML in un database di SQL Server. In questo argomento vengono descritte le procedure seguenti:

  • Come generare istanze XML
  • Come convertire istanze XML in stringhe

Generazione di istanze XML

In SQL Server, è possibile generare istanze XML tramite i metodi seguenti:

  • Cast dei tipi delle istanze di dati di tipo stringa
  • Utilizzo dell'istruzione SELECT con la clausola FOR XML
  • Utilizzo di assegnazioni di costanti
  • Utilizzo del caricamento di massa

Cast di tipo di istanze binarie e di stringa

È possibile analizzare qualsiasi tipo di dati stringa di SQL Server, ad esempio [n][var]char, [n]text, varbinary e 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. L'istanza XML non tipizzata viene controllata per verificare che il formato sia corretto. Se al tipo xml è associato uno schema, viene inoltre eseguita la convalida. Per ulteriori informazioni, vedere Codice XML tipizzato e non tipizzato.

I documenti XML possono essere codificati con codifiche diverse, ad esempio 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.

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 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. 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.

Il contenuto di una stringa varchar viene trattato come documento/frammento XML con codifica a 1 byte da parte del parser XML. 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.

Il contenuto di varbinary viene trattato come flusso di punti di codice passato direttamente al parser XML. Di conseguenza, il documento o frammento XML deve specificare il BOM o altra informazione sulla codifica inline. Il parser esaminerà solo il flusso per determinare la codifica. 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.

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. Ad esempio, nella lettura dei dati da un file XML utilizzando OpenRowset(), specificare i dati da leggere come valore varbinary(max):

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

SQL Server offre internamente una rappresentazione binaria efficiente dell'istanza XML, basata sulla codifica UTF-16. La codifica specificata dall'utente non viene mantenuta, ma viene considerata durante il processo di analisi.

Cast di tipo di tipi CLR definiti dall'utente

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. Per ulteriori dettagli sulla serializzazione XML di un tipo CLR definito dall'utente, vedere XML Serialization from CLR Database Objects.

Gestione degli spazi vuoti nell'istanza XML tipizzata

In SQL 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 tag, ad esempio tag di inizio e di fine, e non vengono sostituiti con entità. 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). Tale differenza è dovuta al fatto che il parser XML di SQL Server riconosce solo un numero limitato di subset DTD, come definito nella specifica XML 1.0. Per ulteriori informazioni sul numero limitato di subset DTD supportati in SQL Server 2005, vedere CAST e 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:

  • Non viene definito l'attributo The xml:space per un elemento o i relativi predecessori.
  • Viene assegnato il valore predefinito all'attributo xml:space attivo per un elemento o i relativi precedessori.

Ad esempio:

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

Risultato:

<root><child/></root>

È tuttavia possibile modificare tale impostazione. 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. Ad esempio:

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. Per ulteriori informazioni sull'utilizzo 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).

Esempio A: Cast di un valore stringa al tipo XML tipizzato e assegnazione a una colonna

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:

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:

INSERT INTO T VALUES (3, @s) 

È possibile utilizzare cast() per eseguire il cast esplicito della stringa al tipo xml:

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

In alternativa, è possibile utilizzare convert(), come illustrato nell'esempio seguente:

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

Esempio B: Conversione di una stringa nel tipo XML tipizzato e assegnazione a una variabile

Nell'esempio seguente, una stringa viene convertita nel tipo xml e assegnata a una variabile con tipo di dati xml:

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 XML

È possibile utilizzare la clausola FOR XML in un'istruzione SELECT per restituire i risultati in formato XML. Ad esempio:

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.

Nella clausola FOR XML, è inoltre possibile utilizzare la direttiva TYPE che restituisce direttamente il risultato di una query FOR XML come tipo xml:

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

Risultato:

<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:

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 ulteriori informazioni su FOR XML, vedere Costruzione di codice XML tramite la clausola FOR XML.

Utilizzo di assegnazioni di costanti

È possibile utilizzare una costante stringa nei casi in cui è prevista un'istanza con tipo di dati xml. Tale operazione è equivalente a un CAST implicito della stringa al formato XML. Ad esempio:

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.

Nell'esempio seguente viene inserita una stringa costante in una colonna di tipo xml:

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. Per ulteriori informazioni, vedere Codice XML tipizzato e non tipizzato.

Utilizzo del caricamento di massa

La funzionalità avanzata OPENROWSET (Transact-SQL) consente di eseguire il caricamento di massa dei documenti XML nel database. È possibile caricare in massa le istanze XML dai file nelle colonne di tipo xml del database. Per esempi reali, vedere Esempi di importazione ed esportazione di massa di documenti XML.

Serializzazione di istanze XML

È possibile utilizzare l'istruzione CAST o CONVERT per serializzare documenti e frammenti di tipo xml in qualsiasi tipo di dati [n][var]char o varbinary.

Un'istanza con tipo di dati XML di cui è stato eseguito il cast a un tipo di stringa Unicode o varbinary viene serializzata nella codifica UTF-16 per impostazione predefinita. Se si esegue il relativo cast a un tipo di stringa non Unicode, l'istanza viene serializzata nella tabella codici del tipo di stringa di destinazione.

Vedere anche

Concetti

Codice XML tipizzato e non tipizzato
Linguaggio XML di manipolazione dei dati (XML DML)
Tipo di dati XML
Applicazioni XML di esempio

Altre risorse

Metodi con tipo di dati XML

Guida in linea e informazioni

Assistenza su SQL Server 2005