Share via


Creazione di variabili e colonne con tipo di dati XML

Il tipo di dati xml è un tipo di dati predefinito in SQL Server ed è simile ad altri tipi predefiniti quali int e varchar. Come per gli altri tipi predefiniti, è possibile utilizzare il tipo di dati xml come tipo di colonna quando si crea una tabella, un tipo di variabile, un tipo di parametro, un tipo restituito dalla funzione oppure in CAST e CONVERT.

Creazione di colonne e variabili

Per creare una colonna del tipo xml come parte di una tabella, utilizzare un'istruzione CREATE TABLE come mostrato dall'esempio seguente:

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

È possibile utilizzare una DECLARE statement per creare una variabile del tipo xml, come mostrato dall'esempio seguente.

DECLARE @x xml 

Creare una variabile xml tipizzata specificando un insieme di schemi XML, come mostrato nell'esempio seguente.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

Per passare un parametro di tipo xml a una stored procedure, utilizzare un'istruzione CREATE PROCEDURE come mostrato dall'esempio seguente.

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

È possibile utilizzare XQuery per eseguire query su istanze XML archiviate in colonne, parametri o variabili. È inoltre possibile utilizzare il linguaggio XML DML (Data Manipulation Language) per l'applicazione di aggiornamenti alle istanze XML. Poiché al momento dello sviluppo lo standard XQuery non prevedeva istruzioni DML per il linguaggio XQuery, SQL Server consente di introdurre in XQuery le estensioni del linguaggio XML DML (Data Modification Language). Queste estensioni consentono l'esecuzione di operazioni di inserimento, aggiornamento ed eliminazione.

Assegnazione di valori predefiniti

All'interno di una tabella è possibile assegnare un'istanza XML predefinita a una colonna di tipo xml. È possibile fornire dati XML predefiniti in una delle due modalità: utilizzando una costante XML o utilizzando un cast esplicito al tipo xml.

Per fornire dati XML predefiniti come costante XML, utilizzare la sintassi come illustrato nell'esempio seguente. Considerare che la stringa è di tipo CAST implicito al tipo xml.

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Per fornire i dati XML predefiniti come un CAST esplicito a xml, utilizzare la sintassi come illustrato nell'esempio seguente.

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server supporta inoltre i vincoli NULL e NOT NULL sulle colonne di tipo xml. Ad esempio:

CREATE TABLE T (XmlColumn xml NOT NULL)

Specifica dei vincoli

Durante la creazione di colonne di tipo xml è possibile definire vincoli a livello di colonna o di tabella. Utilizzare i vincoli nelle situazioni seguenti:

  • Le regole business non possono essere espresse negli schemi XML. Se ad esempio l'indirizzo di recapito di un fiorista deve essere entro 80 Km dal negozio, tale condizione può essere espressa come vincolo sulla colonna XML. Il vincolo può includere metodi per il tipo di dati xml.

  • Il vincolo coinvolge altre colonne XML o non XML nella tabella. Un esempio è l'applicazione dell'ID di un cliente (/Customer/@CustId) trovato in un'istanza XML per la corrispondenza con il valore in una colonna relazionale CustomerID.

È possibile specificare vincoli per le colonne di tipi di dati xml tipizzate o non tipizzate. Nella specifica dei vincoli non è tuttavia possibile utilizzare i metodi con tipo di dati XML. Inoltre, notare che il tipo di dati xml non supporta la colonna seguente e vincoli della tabella:

  • PRIMARY KEY/ FOREIGN KEY

  • UNIQUE

  • COLLATE

    XML fornisce una codifica specifica. Le regole di confronto sono applicabili unicamente ai tipi stringa. Il tipo di dati xml non è di tipo stringa. Fornisce tuttavia la rappresentazione di stringa e consente il cast a e da i tipi di dati stringa.

  • RULE

Un'alternativa all'utilizzo di vincoli è la creazione di un wrapper, una funzione definita dall'utente per eseguire il wrapping del metodo con tipo di dati xml e specificare la funzione definita dall'utente nel vincolo CHECK, come illustrato nell'esempio seguente.

Nell'esempio seguente, il vincolo in Col2 specifica che tutte le istanze XML archiviate nella colonna devono avere un elemento <ProductDescription> contenente un attributo ProductID. Il vincolo viene imposto da questa funzione definita dall'utente:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

Si noti che il metodo exist() con tipo di dati xml restituisce 1 se l'elemento <ProductDescription> nell'istanza contiene l'attributo ProductID. In caso contrario, restituisce 0.

A questo punto è possibile creare una colonna con vincoli a livello di colonna come illustrato di seguito:

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

L'inserimento seguente ha esito positivo:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

L'inserimento seguente ha invece esito negativo, a causa del vincolo:

INSERT INTO T values(1,'<Product />')

Utilizzo di un'unica tabella o di più tabelle

È possibile creare una colonna con tipo di dati xml in una tabella che contiene altre colonne relazionali oppure in una tabella separata con una relazione di chiave esterna con una tabella principale.

È consigliabile creare una colonna con tipo di dati xml nella stessa tabella quando si verifica una delle condizioni seguenti:

  • L'applicazione esegue operazioni di recupero dei dati sulla colonna XML e non richiede un indice XML su tale colonna.

  • Si desidera creare un indice XML sulla colonna con tipo di dati xml e la chiave primaria della tabella principale coincide con la chiave di clustering. Per ulteriori informazioni, vedere Indici su colonne con tipo di dati XML.

È consigliabile creare la colonna con tipo di dati xml in una tabella separata se si verificano le condizioni seguenti:

  • Si desidera creare un indice XML sulla colonna con tipo di dati xml, ma la chiave primaria della tabella principale è diversa dalla chiave di clustering, la tabella principale non ha una chiave primaria, oppure la tabella principale è un heap, ovvero è priva di chiave di clustering. Questa situazione può verificarsi quando si utilizza una tabella principale esistente.

  • Si desidera evitare che la scansione della tabella venga rallentata a causa della presenza della colonna XML, che utilizza spazio sia che venga archiviata all'interno delle righe che all'esterno delle righe.