Supporto XML in SQL Server 2005
La versione 2005 di SQL Server introduce nuove funzionalità tese ad integrare e supportare la tecnologia XML ed i relativi standard associati all'interno del database. Ecco un elenco delle principali innovazioni:
- Creazione di un nuovo tipo dato xml.
- Supporto di indici per le colonne con dati xml tipizzati.
- Potenziamento delle estensioni FOR XML e OPENXML del linguaggio Transact-SQL.
- Supporto al linguaggio XQuery e XPath 2.0 per le interrogazioni ai dati xml.
- Supporto al linguaggio XML DML per la manipolazione dei dati xml.
- Accesso tramite HTTP SOAP / Web Services.
In questo articolo analizzeremo in dettaglio il primo punto della lista: il nuovo tipo dati xml, rimandando l'analisi degli altri punti ad articoli successivi.
Il tipo dati xml
SQL Server 2005 supporta un nuovo tipo dati denominato xml, spendibile alla stregua di tutti gli altri già presenti in SQL Server (come integer, bit, binary, etc.) nella creazione e programmazione degli oggetti di un database.
Esso consente di archiviare documenti e frammenti XML "ben formati" (devono aderire alle regole di formattazione specificate nelle raccomandazioni del W3C per la versione XML 1.0) all'interno del database. Il tipo dati xml si presta a diversi utilizzi, principalmente come:
- Tipo colonna (nella definizione delle colonne di una tabella)
- Tipo variabile (all'interno di batch T-SQL)
- Tipo parametro (come parametro di input o output di una procedura memorizzata)
- Tipo restituito da funzioni definite dall'utente
Colonne xml
L'introduzione del tipo dati xml non modifica la sintassi SQL di creazione di un oggetto tabella, infatti è sufficiente includere nella definizione della stessa il tipo xml per la colonna interessata.
Listato 1. Codice SQL relativo alla creazione di una tabella con una colonna xml
create table dbo.[Product]
(
[ProductId] INT PRIMARY KEY,
[ProductName] NVARCHAR(128) NOT NULL,
[XmlDetails] XML --Abbiamo definito una colonna con il nuovo tipo dati xml
)
Possiamo altresì usare l'istruzione ALTER TABLE per aggiungere altre colonne xml, ad esempio: ALTER TABLE dbo.Product ADD [XmlInfos] xml
.
Non dobbiamo pensare che la colonna xml sia uno statico contenitore di caratteri, va immaginata come una colonna viva, capace di inglobare diverse tecnologie XML, le quali consentono di:
- Validare i dati memorizzati tramite uno schema XSD.
- Creare indici per velocizzare le ricerca delle informazioni al proprio interno
- Fare interrogazioni tramiti i linguaggi XQuery e XPath 2.0
- Supportare elaborazioni complesse dei dati tramite funzionalità built-in come OPENXML e FOR XML.
A margine ricordiamo che esiste un limite di 2 gigabyte per la capacità di memorizzazione di istanze xml nelle colonne xml.
Variabili xml
La semplicità con cui vengono create o aggiunte colonne xml ad una tabella è pari a quella necessaria per definire variabili di tipo xml all'interno di batch T-SQL.
Listato 2. Dichiarare una variabile xml in una procedura memorizzata.
CREATE PROCEDURE prc_GetProductDetails
WITH EXECUTE AS CALLER
AS
declare @xml XML
set @xml = '<dettagli><autore>LucaMilan</autore><pagine>10>/pagine></dettagli>'
select @xml as [Frammento Xml]
GO
Parametri xml
Il tipo dati xml viene anche utilizzato nella definizione dei parametri di input o di output delle stored procedure.
Listato 3. Definizione di un parametro di output.
CREATE PROCEDURE prc_GetProductDetails
@ProductId int,
@Details xml output
WITH EXECUTE AS CALLER
AS
--corpo della procedura
Valore di ritorno xml da funzioni utente
Oltre ai casi precedenti il tipo dati xml può essere speso anche come valore di ritorno nelle funzioni definite dall'utente (UDF).
Listato 4. Definizione di un parametro di output.
CREATE FUNCTION dbo.fn_GetProductDetails()
RETRUNS xml
WITH EXECUTE AS CALLER AS
BEGIN
declare @xml XML
set @xml = '<dettagli><autore>LucaMilan</autore><pagine>10>/pagine></dettagli>'
return(@xml)
END
GO
Limitazioni del tipo dati xml
Pur essendo molto potente e flessibile il tipo dati xml non può essere considerato (nel bene e nel male) alla pari con il tipo dati carattere (char, varchar, nvarchar, ecc?), infatti presenta alcune limitazioni:
- La comparazione non è supportata (eccetto quella con i valori NULL)
- Nessun operatore di eguaglianza
- Non è possibile l'utilizzo nelle clausole ORDER BY e GROUP BY
- Eccetto ISNULL e COLALESCE non possiede funzioni built-in
- Non può essere utilizzato in colonne con vincoli di tipo UNIQUE e di tipo KEY
- Non può essere dichiarato con COLLATE (definiscono il corretto ordinamento delle stringhe all'interno di SQL Server, per lettere accentate, numeri, maiuscole, minuscole oppure lettere di alfabeti diversi).
Per supportare linguaggi o culture differenti dobbiamo affidarci o al supporto UNICODE o alla codifica XML.
Listato 5. Inserimento di documenti XML con encoding differenti.
--Encoding supportati: ISO-8859-1 o utf-8
insert into Product (ProductId,ProductName,XmlDetails) values
(1,'Novità di SQL Server 2005',
'<?xml version="1.0" encoding="ISO-8859-1"?> <dettagli>Lettere accentate mio testo</dettagli>')
--Viceversa un encoding utf-16 o inesistenti del tipo xyz non vengono accettati e producono errori
insert into Product (ProductId,ProductName,XmlDetails) values
(1,'Novità di SQL Server 2005',
'<?xml version="1.0" encoding="utf-16"?> <dettagli>Lettere accentate èigrave;ù</dettagli>')
Varianti del tipo dati xml: tipizzato e non
Il tipo dati xml "può essere servito" a SQL Server 2005 in due gusti: tipizzato e non tipizzato.
XML non tipizzato.
I documenti ed i frammenti XML non tipizzati (untyped XML) non vengono associati, per definizione, a nessuno schema di validazione (XSD Schema). Questo implica l'assenza di regole (formali, semantiche, sintattiche, ecc..) in grado di garantire la validità dei dati XML archiviati.
Listato 6. Inserimenti legali di stringhe XML in una colonna xml.
--possiamo inserire un nodo in formato testo
insert into Product (ProductId,ProductName,XmlDetails)
values (1,'Novità di SQL Server 2005','dettagli sul prodotto')
--possiamo inserire pi?i radice
insert into Product (ProductId,ProductName,XmlDetails)
values (1,'Novità di SQL Server 2005','<dettagli/><dettagli/>')
--oppure un intero frammento XML
insert into Product (ProductId,ProductName,XmlDetails)
values (2,'Novità di SQL Server 2005','<dettagli><autore>Luca Milan</autore><pagine>10</pagine></dettagli>')
--ma anche un documento XML completo di dichiarazione iniziale
insert into Product (ProductId,ProductName,XmlDetails)
values (2,'Novità di SQL Server 2005',' <?xml version="1.0" encoding="utf-8"?> <dettagli><autore>Luca Milan</autore><pagine>10</pagine></dettagli>')
L'inserimento di stringhe XML non tipizzate non è tuttavia libero da vincoli, infatti esso deve aderire alle specifiche del W3C per la versione 1.0 del linguaggio XML.
Listato 7. Inserimenti illegali di stringhe XML in una colonna xml (causano la generazione di errori da parte del parser XML).
--Errore! Non abbiamo chiuso il tag.
insert into Product (ProductId,ProductName,XmlDetails)
values (4,'Libro sulle novità di SQL Server 2005','<dettagli>')
--Errore! Il carattere & non è permesso, avremmo dovuto codificarlo con &
insert into Product (ProductId,ProductName,XmlDetails)
values (5,'Libro sulle novità di SQL Server 2005','<dettagli>SQL Server & altro</dettagli>')
--Errore! Nella dichiarazione del documento compare una versione dell'XML non supportata dal parser
insert into Product (ProductId,ProductName,XmlDetails)
values (2,'Novità di SQL Server 2005','<?xml version="1.1"?> <dettagli><autore>Luca Milan</autore><pagine>10</pagine></dettagli>')
Conclusione
In questo articolo abbiamo introdotto le principali innovazioni di SQL Server 2005 nel supporto alla tecnologia XML, iniziando a discutere del nuovo tipo dati xml. Prossimamente vedremo come definire, modificare e associare schemi XSD a colonne o variabili e parametri di tipo xml.