Condividi tramite


Dati XML tipizzati confrontati con dati XML non tipizzati

È possibile creare variabili, parametri e colonne di tipo xml. Se si desidera, è inoltre posibile associare un insieme di schemi XML a una variabile, un parametro o una colonna di tipo xml. In questo caso, l'istanza del tipo di dati xml viene definita tipizzata. In caso contrario, l'istanza XML è definita non tipizzata.

Tipi di dati XML corretti e xml

Il tipo di dati xml utilizza il tipo di dati standard ISO xml. Ciò consente pertanto l'archiviazione in una colonna XML non tipizzata di documenti di formato XML 1.0 corretto e frammenti di contenuto XML, con nodi di testo e un numero arbitrario di elementi di livello principale. Il sistema verifica che il formato dei dati sia corretto, non richiede che la colonna sia associata a schemi XML e rifiuta i dati con formato non corretto in senso esteso. Questo vale anche per le variabili e i parametri XML non tipizzati.

Schemi XML

Uno schema XML fornisce quanto segue:

  • Vincoli di convalida. Ogni volta che un'istanza xml tipizzata viene assegnata o modificata, tale istanza viene convalidata da SQL Server.

  • Informazioni sui tipi di dati. Gli schemi forniscono informazioni sui tipi di attributi e di elementi presenti nell'istanza del tipo di dati xml. Le informazioni sul tipo forniscono una semantica operativa più precisa ai valori contenuti nell'istanza rispetto a quanto sia possibile con xml non tipizzato. ad esempio è possibile eseguire le operazioni aritmetiche decimali su un valore decimale, ma non su un valore stringa. Per questo motivo, i tipi di dati XML archiviati possono essere estremamente più compatti rispetto ai dati XML non tipizzati.

Scelta tra dati XML tipizzati o non tipizzati

Utilizzare il tipo di dati xml non tipizzato nelle situazioni seguenti:

  • Non è disponibile uno schema per i dati XML.

  • Gli schemi sono disponibili ma non si desidera che i dati vengano convalidati dal server. Questo avviene talvolta quando un'applicazione esegue una convalida sul lato client prima di archiviare i dati sul server, archivia temporaneamente dati XML non validi in base allo schema oppure utilizza componenti di schema non supportati dal server.

Utilizzare il tipo di dati xml tipizzato nelle situazioni seguenti:

  • Gli schemi per i dati XML sono disponibili e si desidera che i dati XML vengano convalidati dal server in base agli schemi XML.

  • Si desidera ottimizzare archiviazione e query basandosi sulle informazioni sui tipi.

  • Si desidera avvalersi delle informazioni sui tipi durante la compilazione delle query.

Nelle colonne, nelle variabili e nei parametri XML tipizzati è possibile archiviare documenti o contenuto XML. Nella dichiarazione è tuttavia necessario specificare, tramite un flag, se si desidera archiviare un documento o del contenuto. È inoltre necessario fornire l'insieme degli schemi XML. Specificare DOCUMENT se ogni istanza XML include esattamente un elemento di livello principale, CONTENT in caso contrario. Nella verifica dei tipi eseguita durante la compilazione delle query il compilatore utilizza il flag DOCUMENT per derivare gli elementi singleton di livello principale.

Creazione di dati XML tipizzati

Prima di creare variabili, parametri o colonne di tipo xml tipizzato, è necessario registrare l'insieme di schemi XML utilizzando CREATE XML SCHEMA COLLECTION (Transact-SQL). È quindi possibile associare l'insieme di schemi XML alle variabili, ai parametri o alle colonne di tipo xml.

Negli esempi seguenti, per specificare il nome dell'insieme di schemi XML viene utilizzata una convenzione di denominazione in due parti. La prima parte è il nome dello schema di AdventureWorks e la seconda parte è il nome dell'insieme di schemi XML.

Esempio: associazione di un insieme di schemi a una variabile di tipo xml

Nell'esempio seguente viene creata una variabile di tipo xml alla quale viene associato un insieme di schemi. L'insieme di schemi specificato è già stato importato nel database AdventureWorks.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection) 

Esempio: specifica di uno schema per una colonna di tipo xml

Nell'esempio seguente viene creata una tabella con una colonna di tipo xml e viene specificato uno schema per la colonna:

CREATE TABLE T1(
 Col1 int, 
 Col2 xml (Production.ProductDescriptionSchemaCollection)) 

Esempio: passaggio di un parametro di tipo xml a una stored procedure

Nell'esempio seguente viene passato un parametro di tipo xml a una stored procedure e viene specificato uno schema per la variabile:

CREATE PROCEDURE SampleProc 
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection) 
AS 

Per l'insieme di schemi XML, si noti quanto segue:

  • Un insieme di schemi XML è disponibile solo nel database in cui è stato registrato come indicato nella sezione relativa alla creazione di un insieme di schemi XML.

  • Se si esegue il cast da una stringa a un tipo di dati xml tipizzato, durante l'analisi vengono inoltre eseguite la convalida e la tipizzazione, in base agli spazi dei nomi degli schemi XML dell'insieme specificato.

  • È possibile eseguire il cast da un tipo di dati xml tipizzato a un tipo di dati xml non tipizzato e viceversa.

Per ulteriori informazioni sugli altri modi disponibili per generare codice XML in SQL Server, vedere Generazione di istanze XML. Dopo avere generato il codice XML, è possibile assegnarlo a una variabile con tipo di dati xml o archiviarlo in colonne di tipo xml per elaborazioni successive.

Nella gerarchia dei tipi di dati, il tipo di dati xml è visualizzato sotto al tipo sql_variant e ai tipi definiti dall'utente, ma sopra ai tipi predefiniti.

Esempio: specifica di facet per vincolare una colonna xml tipizzata

È possibile vincolare le colonne xml tipizzate in modo tale che in ogni istanza archiviata in tali colonne siano consentiti solo elementi principali singoli. A tale scopo, è possibile specificare il facet facoltativo DOCUMENT durante la creazione di una tabella, come illustrato nell'esempio seguente:

CREATE TABLE T(Col1 xml 
   (DOCUMENT Production.ProductDescriptionSchemaCollection))
GO
DROP TABLE T
GO

Per impostazione predefinita, le istanze archiviate nella colonna xml tipizzata sono archiviate come contenuto XML e non come documenti XML. Ciò consente quanto segue:

  • Zero elementi principali oppure nessuno

  • Nodi di testo negli elementi principali

È inoltre possibile specificare in modo esplicito questo comportamento aggiungendo il facet CONTENT, come illustrato nell'esempio seguente:

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection))
GO -- Default

Si noti che è possibile specificare i facet facoltativi DOCUMENT/CONTENT in qualsiasi posizione in cui viene definito il tipo xml (xml tipizzato). Ad esempio, quando si crea una variabile xml tipizzata, è possibile aggiungere il facet DOCUMENT/CONTENT, come illustrato nell'esempio seguente:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection)

Definizione del tipo di documento (DTD, Document Type Definition)

Le colonne, le variabili e i parametri con tipo di dati xml possono essere tipizzati tramite uno schema XML, ma non tramite una definizione DTD. Sia per i tipi di dati XML tipizzati che non tipizzati, è tuttavia possibile utilizzare DTD inline per specificare valori predefiniti e sostituire i riferimenti alle entità con le corrispondenti forme espanse.

È possibile convertire DTD in documenti di schema XML tramite strumenti di terze parti e caricare gli schemi XML nel database.

Aggiornamento di dati XML tipizzati da SQL Server 2005 a SQL Server 2008

In SQL Server 2008 sono state effettuare diverse estensioni per il supporto dello schema XML, incluso il supporto per convalida lax, la gestione migliorata dei dati delle istanze xs:date, xs:time e xs:dateTime e il supporto aggiunto per i tipi elenco e unione. Nella maggior parte dei casi le modifiche non influiscono sull'esperienza dell'aggiornamento. Tuttavia, se si utilizza un insieme di schemi XML in SQL Server 2005 che consentiva valori di tipo xs:date, xs:time o xs:dateTime (o qualsiasi sottotipo), quando si allega il database SQL Server 2005 a SQL Server 2008 si verificano i seguenti passaggi di aggiornamento:

  1. Per ogni colonna XML, tipizzata con un insieme di schemi XML che contiene elementi o attributi tipizzati come xs:anyType, xs:anySimpleType, xs:date o uno qualsiasi dei sottotipi, xs:time o uno qualsiasi dei suoi sottotipi oppure xs:dateTime o uno qualsiasi dei suoi sottotipi o i tipi unione ed elenco che contengono uno di questi tipi, si verifica quanto riportato di seguito:

    1. Tutti gli indici XML nella colonna saranno disattivati.

    2. Tutti i valori SQL Server 2005 continueranno a essere rappresentati nello Z timezone, perché sono stati normalizzati allo Z timezone.

    3. Qualsiasi valore xs:date o xs:dateTime precedente al 1° gennaio dell'anno 1 determinerà un errore di runtime quando l'indice viene ricompilato oppure viene eseguita un'istruzione XQuery o SML-DML rispetto al tipo di dati XML contenente quel valore.

  2. Ogni anno negativo nei facet o nei valori predefiniti xs:date o xs:dateTime in un insieme di schemi XML sarà aggiornato automaticamente al valore più piccolo consentito dal tipo di base xs:date o xs:dateTime (ad esempio, 0001-01-01T00: 00:00.0000000 Z per xs:dateTime).

Si noti che ancora è possibile utilizzare una semplice istruzione Select di SQL per recuperare il tipo di dati XML intero, anche se contiene anni negativi. Si consiglia di sostituire gli anni negativi con un anno all'interno dell'intervallo appena supportato o modificare il tipo dell'elemento o dell'attributo in xs:string.