Creare istanze di dati XML

Si applica a: SQL Server Azure SQL DatabaseIstanza gestita di SQL di Azure

Questo articolo descrive come generare istanze XML.

In SQL Server è possibile generare istanze XML nei modi 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.

Tipo di stringhe cast e istanze binarie

È possibile analizzare uno dei tipi di dati stringa SQL Server, ad esempio [n][var]char, [n]text, varbinary e image, nel tipo di dati xml eseguendo il cast (CAST) o convertendo (CONVERT) la stringa nel tipo di dati xml. Il codice XML non tipizzato viene controllato per verificare che sia ben formato. Se è presente uno schema associato al tipo xml , viene eseguita anche la convalida. Per altre informazioni, vedere Confrontare dati XML tipizzati 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 può avere un indicatore di ordine di byte UTF-16, ma non è necessario, poiché il contesto del tipo di origine rende chiaro che può essere solo un documento con codifica Unicode a due 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 è nota in anticipo e i dati vengono passati come dati stringa o binari anziché dati XML prima del cast in XML, è consigliabile considerare i dati come varbinary. Ad esempio, quando si leggono dati da un file XML usando OpenRowset(), è necessario 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 rappresenta internamente XML in una rappresentazione binaria efficiente che usa la codifica UTF-16. La codifica fornita dall'utente non viene mantenuta, ma viene considerata durante il processo di analisi.

Tipi CLR definiti dall'utente di cast dei tipi

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 altre informazioni sulla serializzazione XML di un tipo CLR definito dall'utente, vedere Serializzazione XML da oggetti di database CLR.

Gestire lo spazio vuoto nel codice XML tipizzato

In SQL Server, lo spazio vuoto all'interno del contenuto dell'elemento viene considerato insignificante se si verifica all'interno di una sequenza di dati di tipo carattere solo spazi vuoti delimitati dal markup, ad esempio i tag begin o end e non è 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). Questo perché il parser XML in SQL Server riconosce solo un numero limitato di subset DTD, come definito in XML 1.0. Per altre informazioni sui subset DTD limitati 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:

  • L'attributo xml:space non è definito in un elemento o nei relativi elementi predecessori.

  • Viene assegnato il valore predefinito all'attributo xml:space attivo per un elemento o i relativi predecessori.

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 di stile non viene usato o il relativo valore è impostato su 0, gli spazi vuoti non significativi non vengono mantenuti per la conversione dell'istanza xml DT. Per altre informazioni su come usare l'operatore CONVERT e il relativo parametro di stile durante la conversione dei dati stringa in istanze DT xml, vedere CAST e CONVERT (Transact-SQL).

Esempio: Eseguire il cast di un valore stringa nel codice XML tipizzato e assegnarlo 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 impostare in modo esplicito cast() la stringa sul tipo xml :

INSERT INTO T VALUES (3, CAST(@s AS XML));

In alternativa, è possibile usare convert(), come illustrato di seguito:

INSERT INTO T VALUES (3, CONVERT(XML, @s));

Esempio: convertire una stringa in xml tipizzato e assegnarla 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;

Usare l'istruzione SELECT con una 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 altre informazioni su FOR XML, vedere FOR XML (SQL Server).

Nota

SQL Server restituisce istanze del tipo di dati xml al client in seguito a costrutti di server diversi, ad esempio query FOR XML che usano la direttiva TYPE o in cui il tipo di dati xml viene usato per restituire XML da colonne, variabili e parametri di output SQL. 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.

Usare assegnazioni 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 altre informazioni, vedere Confrontare dati XML tipizzati con dati XML non tipizzati.

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

Contenuto della sezione

Articolo Descrizione
Recuperare ed eseguire query su dati XML Descrive le parti delle istanze XML che non vengono mantenute quando vengono archiviate nei database.

Vedi anche