1. IntroduzioneUna delle novità che più ho apprezzato in
SQL Server 2005 è l'implementazione del nuovo tipo di dati
XML. Era quasi inevitabile che
Microsoft decidesse di apportare questa modifica perché ormai l'
XML è la lingua con cui si "parlano" tutte le piattaforme essendo diventato ormai uno standard solido e usato da tutti.
2. XML in SQL Server 2000L'utilizzo di
XML in
SQL Server non è proprio una cosa nuova perché già in
SQL Server 2000 è stata introdotta la possibilità di usare
XML, utilizzando la clausola
FOR XML in una
SELECT, come abbiamo anche visto un precedente Tip (
http://www.dotnethell.it/tips/XMLSQLServer.aspx ">Restituire un file XML tramite SQL Server ), oppure utilizzando
OPENXML. Inoltre per memorizzare interamente un file XML nel database, era necessario inserire il contenuto in campi text o nei campi BLOB perdendo le potenzialità del formato XML.
3. Le novità di SQL Server 2005La vera novità in
SQL Server 2005 rispetto alla versione 2000 e che adesso abbiamo un tipo di dati nativo XML ovvero possiamo utilizzarlo come :
? Campo di una tabella
? Variabile di input/output per stored procedure e funzioniQuesto permette di sfruttare al massimo tutte le funzionalità dell'
XML, e quindi ora all'interno del campo
XML si potranno inserire direttamente interi documenti o anche solo porzioni, naturalmente con il vincolo base che siano
well-formed. Per chi volesse ulteriori informazioni circa il significato di
well-formed può consultare direttamente la documentazione del
W3C (
http://www.w3.org/TR/REC-xml/#sec-well-formed ">XML 1.0 (Third Edition)
Quindi se proviamo ad inserire nel database un file non well-formed sarà direttamente SQL Server che ci avviserà che l'operazione non è possibile e quindi la
INSERT non avrà esecuzione.
Vediamo un po' all'opera quanto detto fino ad ora.
-- Creo tabella con campo XML
CREATE TABLE [XMLTable]
(IdXML int IDENTITY(1,1) NOT NULL,
campoXML xml NULL
) ON PRIMARY
--inserisco un file well-formed
INSERT INTO XMLTABLE
(campoXML)
VALUES('<?xml version="1.0" encoding="utf-8" ?>
<root>
<libro>
<autore>Dan Brown</autore>
<titolo>Il codice da vinci</titolo>
<genere>romanzo</genere>
</libro>
</root>
')
Questa
INSERT non ritorna nessun errore ed esegue correttamente l'inserimento nel Database. Diversamente utilizzando un file
XML non well-formed avremo una segnalazione d'errore
E per recuperare quanto inserito ci basta fare una semplice SELECT:
e quello che c'è all?interno viene recuperato così come è stato inserito. La clausola
FOR XML è stata mantenuta per compatibilità.
? Inoltre in
SQL Server 2005 c'è il pieno supporto per gli Schema(xsd) ovvero si può inserire uno schema per validare un file xml.
? Supporto per le ricerche full-text
?
XML Index ovvero creare gli indici per il campo XML
? Supporto per il casting (i dati di tipo XML possono essere convertiti infatti in char, varchar, nchar e nvarchar)
? Supporto per
XPath e
XQuery4. XQueryXQuery è un nuovo standard che permette di fare delle query sui dati in formato XML; è più potente rispetto a
XPath ed in
SQL Server 2005 viene utilizzata la bozza del
W3C di Novembre del 2003 perché lo standard è ancora in evoluzione.
Sito di riferimento:
http://www.w3.org/TR/xquery ">W3C XQuery
XQuery utilizza una serie di istruzioni che possono essere raccolte ed identificate con la sigla
"FLOWR" dove ogni lettera corrisponde alla lettera iniziale di ogni istruzione.
? For
? Let(non implementata)
? Order by
? Where
? ReturnMa può utilizzare benissimo anche query
XPath.
Facciamo un'esempio:
Eseguo queste 3 insert:
INSERT INTO XMLTABLE
(campoXML)
VALUES('<libro>
<autore>Dan Brown</autore>
<titolo>Il codice da vinci</titolo>
<genere>romanzo</genere>
<anno>2003</anno>
</libro>
')
INSERT INTO XMLTABLE
(campoXML)
VALUES('<libro>
<autore>Giorgio Faletti</autore>
<titolo>Io Uccido</titolo>
<genere>thriller</genere>
<anno>2002</anno>
</libro>
')
INSERT INTO XMLTABLE
(campoXML)
VALUES('<libro>
<autore>Ken Follet</autore>
<titolo>I pilastri della terra</titolo>
<genere>romanzo</genere>
<anno>1998</anno>
</libro>
')
Poi per recuperare per esempio il nome degli autori con una query
XPath utilizzerò la query seguente:
Quindi come vedete è possibile continuare ad usare
XPath.
XQuery però è decisamente più potente visto che utilizza una sintassi per certi versi simile a quella di
SQL. Qui di seguito un esempio per recuperare i titoli dei libri che sono stati publicati dopo il 2000:
select idxml, campoxml.query('for $a in /libro
where $a/anno>2000
return <titolo>{data ($a/titolo)}</titolo>') from xmltablee il risultato è il seguente:
Analizziamo lo script:
Allora noi gli abbiamo detto di fare una query sul nodo libro attraverso for
$a in /libro,
$a è un segnalibro che viene utilizzato nelle clausole
where, order by e il return. Il simbolo del dollaro($) è obbligatorio ed è necessario anteporlo alla variabile scelta (nel nostro caso
a). Poi con
where $a/anno > 2000 gli abbiamo detto di filtrare i record che hanno il valore dell'anno maggiore di 2000 e infine dobbiamo dirgli cosa ritornare e in che formato.
Importante la funzione
query deve sempre ritornare un
XML valido per questo ho definito
e con
{data ($a/titolo)} gli ho chiesto il valore del nodo titolo.
Le funzioni che si possono usare con il tipo dati
XML sono le seguenti:
? query
? value
? exist
? modify
? nodesA diffirenza di query,
value ritorna un dato SQL Server:
select idxml, campoxml.value('(/libro/autore)[1]
','varchar(50)'
) as autore from xmltableImportante definire l'indice
[1] perchè altrimenti SQL Server ritonerebbe un errore di questo tipo:
Questo perché sullo stesso campo potrebbero esserci nodi dello stesso tipo e quindi bisogna specificare su quale nodo deve essere fatta la ricerca.
Per modificare invece utilizziamo la funzione
modify, esempio vogliamo inserire l'attributo id per il libro
UPDATE xmltable
SET campoxml.modify('insert attribute id {"1"} into(/libro[1])')Questo però comporterà che tutti avranno lo stesso
id, ma io voglio che venga preso l'
id del campo chiave allora utilizziamo la funzione
sql:column quindi:
UPDATE xmltable
SET campoxml.modify('replace value of (/libro[1]/@id) with sql:column("idxml")')Avete appena visto nei casi appena mostrati due esempi per modificare con l'istruzione
modify dei dati
XML, nel primo caso inserendo tramite
insert un nuovo attributo e aggiornando l'attributo stesso tramite
replace value nel secondo.
Così come abbiamo aggiunto un attributo sarà possibile eliminarlo utilizzando l'espressione
delete.
ConclusioniConcludendo posso dire che nello sviluppo di
SQL Server 2005 è stato fatto un gran lavoro, a cominciare appunto dal supporto nativo al formato
XML. Grazie ad
XQuery è possibile ora eseguire facilmente ed in modo efficiente interrogazioni sulle basi dati che facciano uso del formato
XML. Naturalmente ciò non significa che ora debba sempre essere usato questo formato per ogni cosa. E' da notare però che molte aziende ormai stanno utilizzando
XML per far interagire sistemi, piattaforme ed applicazioni diverse in modo flessibile rispetto al passato. Oggi con le nuove features offerte da
SQL 2005 si potranno immagazzinare ed elaborare molto più facilmente dati
XML (esempio listini, fatture, ecc.) provenienti da clienti e/o partner.