Condividi tramite


Confronto dati XML tipizzati con dati XML non tipizzati

È possibile creare variabili, parametri e colonne di tipo xml. Se si desidera, è inoltre possibile associare una raccolta XML Schema a una variabile, un parametro o una colonna di tipo xml. In questo caso, l'istanza del xml tipo di dati viene chiamata 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 XML Schema e rifiuta i dati con formato non corretto in senso esteso. Questo vale anche per le variabili e i parametri XML non tipizzati.

XML Schema

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

Usare il tipo di dati tipizzato xml nelle situazioni seguenti:

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

  • Si desidera avvalersi delle ottimizzazioni query e dell'archiviazione 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 la raccolta XML Schema. 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 poter creare variabili tipizzatexml, parametri o colonne, è necessario registrare la raccolta di XML Schema usando CREATE XML SCHEMA COLLECTION (Transact-SQL). È quindi possibile associare la raccolta XML Schema alle variabili, ai parametri o alle colonne del tipo di dati xml.

Negli esempi seguenti, per specificare il nome della raccolta XML Schema viene utilizzata una convenzione di denominazione in due parti. La prima parte è il nome dello schema e la seconda parte è il nome della raccolta XML Schema.

Esempio: Associazione di una raccolta di schemi a una variabile di tipo XML

Nell'esempio seguente viene creata unaxml variabile di tipo e viene associata una raccolta di schemi. La raccolta di schemi specificata è già stata importata 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 la raccolta XML Schema, si noti quanto segue:

  • Una raccolta XML Schema è disponibile solo nel database in cui è stata registrata tramite CREATE XML SCHEMA COLLECTION.

  • 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 XML Schema della raccolta specificata.

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

Per altre informazioni sugli altri modi disponibili per generare codice XML in SQL Server, vedere Creare istanze di dati 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 XML Schema, 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 XML Schema tramite strumenti di terze parti e caricare XML Schema nel database.

Aggiornamento di dati XML tipizzati da SQL Server 2005

SQL Server 2008 ha apportato diverse estensioni al supporto di XML Schema, tra cui il supporto per la convalida lax, la gestione migliorata dei dati dell'istanza xs:date, xs:time e xs:dateTime e aggiunto il supporto per i tipi di elenco e unione. Nella maggior parte dei casi le modifiche non influiscono sull'esperienza dell'aggiornamento. Tuttavia, se è stata usata una raccolta di XML Schema in SQL Server 2005 che ha consentito valori di tipo xs:date, xs:time o xs:dateTime (o qualsiasi sottotipo), i passaggi di aggiornamento seguenti si verificano quando si collega il database SQL Server 2005 a una versione successiva di SQL Server:

  1. Per ogni colonna XML, tipizzata con una raccolta XML Schema 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 disabilitati.

    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 xs:date o xs:dateTime o nei valori predefiniti in una raccolta XML Schema 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 del nuovo intervallo supportato o modificare il tipo dell'elemento o dell'attributo in xs:string.

Vedere anche

Creare istanze di dati XML
metodi con tipo di dati xml
Linguaggio XML di manipolazione dei dati (XML DML)
Dati XML (SQL Server)