Tipo di dati XML

SQL Server 2005

Il tipo di dati xml consente di archiviare documenti e frammenti XML in un database di SQL Server. Un frammento XML è un'istanza XML priva di un elemento di livello principale. È possibile creare colonne e variabili con tipo di dati xml e archiviare al loro interno istanze XML. Si noti che la rappresentazione archiviata delle istanze con tipo di dati xml non può superare i 2 GB.

È possibile facoltativamente associare un insieme di schemi XML a una colonna, un parametro o una variabile con tipo di dati xml. Gli schemi nell'insieme vengono utilizzati per la convalida e la tipizzazione delle istanze XML. In questo caso, il codice XML viene definito tipizzato.

Il tipo di dati xml e i metodi associati consentono di integrare codice XML nel framework relazionale di SQL Server. Per ulteriori informazioni, vedere Metodi con tipo di dati XML.

ms189887.note(it-it,SQL.90).gifNota:
In questo argomento viene descritto il codice XML non tipizzato. Per informazioni sul codice XML tipizzato, vedere Codice XML tipizzato e non tipizzato.

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. Le procedure sono illustrate negli esempi seguenti.

Esempio A

Creazione di una colonna di tipo xml:

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

Esempio B

Creazione di una variabile di tipo xml:

DECLARE @x xml 

Creazione di una variabile xml tipizzata specificando un insieme di schemi XML:

declare @x xml (Sales.StoreSurveySchemaCollection)

Esempio C

Passaggio di un parametro di tipo xml a una stored procedure:

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 introduce in XQuery le estensioni del linguaggio XML DML (Data Modification Language). Queste estensioni consentono l'esecuzione di operazioni di inserimento, aggiornamento ed eliminazione.

All'interno di una tabella è possibile assegnare un'istanza XML predefinita a una colonna di tipo xml. È possibile fornire il codice XML predefinito in uno dei modi illustrati di seguito.

Esempio A

Specificazione del codice XML predefinito come costante XML (viene eseguito il cast esplicito della stringa al tipo xml):

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

Esempio B

Specificazione del codice XML predefinito come CAST esplicito al tipo xml:

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)

Durante la creazione di colonne di tipo xml è possibile definire vincoli a livello di colonna o di tabella. Nella specifica dei vincoli non è tuttavia possibile utilizzare i metodi con tipo di dati XML. Un'alternativa è 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 />')

L'istruzione ALTER TABLE supporta il tipo di dati xml. Ad esempio, è possibile modificare qualsiasi colonna di tipo string nel tipo di dati xml. Si noti che in questi casi è necessaria la correttezza del formato dei documenti contenuti nella colonna. Se inoltre si sta modificando il tipo della colonna da stringa a XML tipizzato, i documenti nella colonna vengono convalidati rispetto agli schemi XSD specificati.

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

È possibile modificare una colonna di tipo xml da XML non tipizzato a XML tipizzato. Ad esempio:

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
ms189887.note(it-it,SQL.90).gifNota:
Lo script verrà eseguito sul database AdventureWorks, poiché l'insieme di schemi XML Production.ProductDescriptionSchemaCollection viene creato come parte del database AdventureWorks.

Nell'esempio precedente, tutte le istanze archiviate nella colonna vengono convalidate e tipizzate rispetto agli schemi XSD nell'insieme specificato. Se la colonna contiene una o più istanze XML non valide rispetto allo schema specificato, l'istruzione ALTER TABLE avrà esito negativo e non sarà possibile modificare il tipo della colonna da XML non tipizzato a XML tipizzato.

ms189887.note(it-it,SQL.90).gifNota:
Se una tabella è di grandi dimensioni, la modifica di una colonna di tipo xml può risultare onerosa, poiché è necessario un controllo di correttezza del formato di ogni documento e, nel caso del codice XML tipizzato, è necessaria anche la convalida.

Per ulteriori informazioni sul codice XML tipizzato, vedere Codice XML tipizzato e non tipizzato.

Le colonne di tipo xml possono essere utilizzate per la creazione di viste. Nell'esempio seguente viene creata una vista nella quale il valore di una colonna di tipo xml viene recuperato utilizzando il metodo value() del tipo di dati xml.

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

Eseguire la query seguente sulla vista:

SELECT * 
FROM   MyView

Risultato:

ProductID   PName      
----------- ------------
1           SomeName 
ms189887.note(it-it,SQL.90).gifNota:
Il tipo di dati xml non può essere utilizzato nelle viste partizionate distribuite.

Le istanze XML possono rappresentare l'origine oppure il tipo di una colonna calcolata. Ad esempio, nell'istruzione CREATE TABLE seguente una colonna (col2) di tipo xml viene calcolata in base a col1:

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

Il tipo di dati xml può inoltre rappresentare l'origine per la creazione di una colonna calcolata, come illustrato nell'istruzione CREATE TABLE seguente:

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

È possibile creare una colonna calcolata mediante l'estrazione di un valore da una colonna di tipo xml, come illustrato nell'esempio seguente. Poiché non è possibile utilizzare direttamente i metodi con tipo di dati xml per la creazione di colonne calcolate, l'esempio innanzitutto definisce una funzione (my_udf) che restituisce un valore da un'istanza XML. La funzione esegue il wrapping del metodo value() con tipo di dati xml. Il nome della funzione viene dunque specificato nell'istruzione CREATE TABLE per la colonna calcolata.

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

Come il precedente, l'esempio successivo definisce una funzione per la restituzione di un'istanza con tipo di dati xml per una colonna calcolata. All'interno della funzione, il metodo query() con tipo di dati xml recupera un valore da un parametro del tipo xml.

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

Nell'istruzione CREATE TABLE seguente, Col2 è una colonna calcolata che utilizza i dati XML (elemento <Features>) restituiti dalla funzione:

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

Aggiunte alla community

AGGIUNGI
Mostra: