Condividi tramite


Generazione di istanze XML

Come descritto in Tipo di dati XML, è possibile archiviare le istanze XML in un database SQL Server. Questo argomento descrive come generare le 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 bulk.

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 Dati XML tipizzati confrontati con dati XML non tipizzati.

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 consente di offrire 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 Serializzazione XML da oggetti di database CLR.

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 markup, 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 in SQL Serverriconosce 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, 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: 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: 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.

[!NOTA]

SQL Server consente di restituire al 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. 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. Se tuttavia si utilizza FOR XML senza la direttiva TYPE, i dati XML vengono restituiti come tipo string. In tutti i casi, il provider client sarà sempre in grado di gestire entrambe i formati di 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 Dati XML tipizzati confrontati con dati XML non tipizzati.

Utilizzo del caricamento bulk

La funzionalità avanzata OPENROWSET (Transact-SQL) consente di eseguire il caricamento bulk dei documenti XML nel database. È possibile eseguire un caricamento bulk delle istanze XML dai file nelle colonne di tipo xml del database. Per esempi reali, vedere Esempi di importazione ed esportazione bulk di documenti XML. Per ulteriori informazioni sul caricamento dei documenti XML, vedere Caricamento di dati XML.

Contenuto della sezione

Argomento

Descrizione

recupero di dati XML

Descrizione delle parti di istanze XML che non sono mantenute quando vengono archiviate nei database.