Home Page Home Page Articoli XML in SQL Server 2005

XML in SQL Server 2005

Scopriamo come è stato implementato il supporto nativo XML in SQL Server 2005, mostrando anche come è possibile con XQuery gestire e manipolare i dati XML all'interno del Database.
Autore: Marco Caruso Livello:
1. Introduzione
Una 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 2000
L'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 2005
La 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 funzioni


Questo 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 XQuery

4. XQuery
XQuery è 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
? Return


Ma 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 xmltable


e 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
? nodes


A diffirenza di query, value ritorna un dato SQL Server:

select idxml, campoxml.value('(/libro/autore)[1]
','varchar(50)'
) as autore from xmltable


Importante 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.

Conclusioni
Concludendo 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.
Voto medio articolo: 2.7 Numero Voti: 9
Marco Caruso

Marco Caruso

Consulente Informatico di Roma, inizia la sua carriera nel 2000 utilizzando la tecnlogia Lotus Notes e il server Domino. Alla fine del 2001 passa alla piattaforma Microsoft.NET dove si appassiona sempre più a questa nuova tecnlogia. Importanti progetti a livello Enterprise per grandi società lo portano a cono... Profilo completo

Articoli collegati

Creare pagine HTML utilizzando XML e XSLT (XML2HTML)
In questo articolo vedremo come creare una pagina HTML "formattata" partendo da un file XML e trasformandolo tramite XSLT. Tutti sapete cosa sia un documento HTML, quasi tutti sapete cosa sia un documento XML ma pochi sanno cosa sia l’ XSLT, cerchiamo, quindi, in poche righe, di capire di cosa stiamo parlando.
Autore: Stefano Passatordi | Difficoltà: | Commenti: 7
BLOB in XML
In quest'articolo vedremo come scrivere e leggere Blob(Binary Large Object) in un file XML utilizzando la classe XmlTextWriter e la classe XmlTextReader.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Il DOM XML
Microsoft ha messo a disposizione degli sviluppatori un intero namespace (System.XML) per la manipolazione dei files XML tramite il DOM, vediamo in questo articolo alcuni percorsi per operare facilmente con XML
Autore: Marco Caruso | Difficoltà: | Commenti: 16
SOAP Headers e sicurezza nei web services
Hai un web service e non sai se è sicuro? Questo articolo ti illustra uno dei tanti metodi per rendere sicuro il tuo web service, i SOAP Headers.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2 | Voto:
dotNetHell Contents Web Service
Un nuovo Web Service a disposizione di tutti quelli che desiderano pubblicare i contenuti offerti da dotNetHell (Articoli, News e Tips) nei loro siti Web tramite l'utilizzo di script preconfezionati per ASP Classico, ASP.NET, PHP e Javascript
Autore: David De Giacomi | Difficoltà: | Voto:
Ricerca in un file XML: un Textbox per il tuo sito dinamico
Una soluzione semplice ed elegante per creare un sito Web dinamico consiste nell?utilizzo di XML. Vi mostrerò in questo articolo come implementare un campo di ricerca per i vostri siti basati su XML e .NET.
Autore: Luigi Corrias | Difficoltà: | Commenti: 2
Il calcolo del Codice Fiscale
Mostreremo in questo articolo un algoritmo molto comune; è l'algoritmo che ci permette di calcolare il Codice Fiscale. Oltre a questo dotNetHell mette a disposizione un Web Service che può essere "consumato" (utilizzato) da chiunque liberamente.
Autore: David De Giacomi | Difficoltà: | Commenti: 12 | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5