Query XML con T-SQL e SQL Server 2000

di Luca Milan, in Database,

Nella maggior parte delle applicazioni sviluppate per SQL Server i programmatori sono abituati a recupare i dati contenuti nelle tabelle dei databases come set di righe, ad esempio con l'oggetto recordset di ADO e come tali vengono inviati al client per l'elaborazione.
La grossa novità introdotta da Microsoft nella versione 2000 di SQL Server è la possibilità di estendere le funzionalità standard dell'istruzione SELECT per recuperare i dati in formato XML.

Poter estrarre dati in formato XML da SQL Server 2000 significa acquisire tutti i vantaggi della cosidettalingua francadi Internet: facilitare lo scambio di informazioni tra sistemi e organizzazioni differenti, separare in modo efficace il contenuto dalla presentazione, rappresentare in modo gerarchico informazioni strutturalmente complesse.

L'istruzione SELECT ... FOR XML

Per poter recuperare i dati in formato XML è stata introdotta una nuova estensione all'istruzione SELECT del linguaggio Transact SQL, la clausola FOR XML.

Aggiungendo la parola chiave FOR XML alla fine di una SELECT il processore delle query di SQL viene avvertito che l'output desiderato del rowset ritornato deve essere una stringa di tipo XML .
Vediamo in modo esteso la sintassi di una SELECT .. FOR XML:

SELECT colonne_da_visualizzare
FROM nome_tabella
WHERE condizioni_di_ricerca
FOR XML AUTO | RAW | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]

La clausola FOR XML supporta tre modalità di formattazione: AUTO, RAW, EXPLICIT e numerose opzioni applicabili all'output: XMLDATA, ELEMENTS, BINARY BASE64.
Prima ho parlato di output tipo XML perchè le query SELECT .. FOR XML ritornano un frammento XML che non rappresenta un documento XML vero e proprio.
Difatti per definirsi tale un documento XML per essere ben formato cioè il markup ed i caratteri in esso contenuto devono aderire a regole precise (che esulano dallo scopo di questo articolo), osserviamo il frammento prodotto dalla query:

SELECT TOP 2 au_lname, au_fname FROM authors AUTORE FOR XML AUTO
<AUTORE au_lname="Bennet" au_fname="Abraham"/>
<AUTORE au_lname="Blotchet-Halls" au_fname="Reginald"/>

la stringa ritornata da SQL Server non è un documento XML valido, ma un frammento XML che contiene un elemento per ogni riga della query. Per ottenere un documento ben formato a partire dalla stringa precedente dobbiamo aggiungere un tag radice (chiamato AUTORI) che contenga tutti gli altri:

<AUTORI>
    <AUTORE au_lname="Bennet" au_fname="Abraham"/>
    <AUTORE au_lname="Blotchet-Halls" au_fname="Reginald"/>
</AUTORI>

ora il documento XML è ben formato! (facciamo riferimento a questo tipo di documento quando leggiamo documento XML all'interno dell'articolo)

Usare la modalità RAW

La modalità RAW è sicuramente la più immediata e semplice da intuire. La query ritorna un elemento XML per ogni riga del rowset. Ogni singolo elemento a sua volta contiene un attributo per ogni colonna recuperata. Il nome dell'elemento XML è genericamente indicato con row. Ogni attributo porta il nome della colonna corrispondente ed all'interno contiene il valore di quella determinata colonna.
Data la query:

SELECT TOP 4 au_lname, au_fname FROM authors FOR XML RAW

Questo è il frammento XML prodotto:

 <row au_lname="Bennet" au_fname="Abraham"/>

<row au_lname="Blotchet-Halls" au_fname="Reginald"/>

<row au_lname="Carson" au_fname="Cheryl"/>

<row au_lname="DeFrance" au_fname="Michel"/>

Personalizzare l'output XML con la modalità RAW

Talvolta è utile "personalizzare" l'output XML di una query, ad esempio utilizzando l'alias di colonna per rinominare in modo più oppurtuno gli attributi degli elementi row-XML. Modifichiamo la query precedente sostituendo i criptici au_lname e au_fname con i più famigliari cognome e nome.

SELECT TOP 4 au_lname AS cognome, au_fname AS nome FROM authors FOR XML RAW

Ecco il risultato ottenuto

<row cognome="Bennet" nome="Abraham"/>
<row cognome="Blotchet-Halls" nome="Reginald"/>
<row cognome="Carson" nome="Cheryl"/>
<row cognome="DeFrance" nome="Michel"/>
Nella modalità row abbiamo una limitazione piuttosto grande, non possiamo cambiare il nome all'elemento row!
3 pagine in totale: 1 2 3
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti