Magazine

XQuery e campi XML in SQL Server: come parametrizzare le query xml e generare tabelle da xml

Roberto Schiabel

05/02/2007

In questo articolo vedremo come rendere 'dinamiche' le xquery attraverso l'impiego dei parametri. Nella seconda parte, vedremo come generare nuove tabelle da xml gia' presenti per essere come subquery.

0%100%
per esprimere un voto รจ necessario registrarsi al sito

SQL, XML

In questo articolo vedremo come rendere 'dinamiche' le xquery attraverso l'impiego dei parametri.

Nella seconda parte, vedremo come generare nuove tabelle da xml gia' presenti per essere come subquery.

Prenderemo, come base di partenza, una istruzione SQL da un precedente esempio e la renderemo indipendente dai valori cablati.

Otterremo cosi' una query adatta ad un uso piu' realistico che accademico.

Prendiamo in considerazione la istruzione SQL del primo esempio:

SELECT 
testoXML.exist('(//prodotto/prezzi/prezzo[@listino="UK_GBP"])') AS pexist
, testoXML.query('(//prodotto/prezzi/prezzo[@listino="UK_GBP"])[1]/../..') AS prodotto
, testoXML.query('(//prodotto/prezzi/prezzo[@listino="UK_GBP"])[1]/parent::node()') AS prezzi
, testoXML.query('(//prodotto/prezzi/prezzo[@listino="UK_GBP"])[1]') AS prezzo
, testoXML.value('(//prodotto/prezzi/prezzo[@listino="UK_GBP"])[1]', 'decimal(10, 2)') AS prezzo_valore
FROM tabellaXML

possiamo modificare la definizione del listino, nel seguente modo:

declare @mylistino varchar(30);
set @mylistino = 'UK_GBP';
SELECT
testoXML.exist('(//prodotto/prezzi/prezzo[@listino=sql:variable("@mylistino")])') AS pexist
, testoXML.query('(//prodotto/prezzi/prezzo[@listino=sql:variable("@mylistino")])[1]/../..') AS prodotto
, testoXML.query('(//prodotto/prezzi/prezzo[@listino=sql:variable("@mylistino")])[1]/parent::node()') AS prezzi
, testoXML.query('(//prodotto/prezzi/prezzo[@listino=sql:variable("@mylistino")])[1]') AS prezzo
, testoXML.value('(//prodotto/prezzi/prezzo[@listino=sql:variable("@mylistino")])[1]', 'decimal(10, 2)') AS prezzo_valore
FROM tabellaXML

dove il listino e' stato sostituito con sql:variable, il cui scopo e' riferirsi ad una variabile sql.
Lo stesso principio puo' essere applicato a sql:column, il cui scopo e' riferirsi ad una colonna presente nella query.

Queste istruzioni si applicano molto bene con delle strutture a query annidate, anche di XML.
L'istruzione CROSS APPLY ci viene in aiuto (con nodes) perche' permette di ricavare parti di un xml e generale delle righe in nuove tabelle.

SELECT nuovaTabellaXML.prezzi.query('.')
FROM tabellaXML CROSS APPLY testoXML.nodes('//prodotto') AS nuovaTabellaXML(prezzi)

Eseguendo la query qui sopra, si ottiene il seguente risultato


dove si puo' notare che ogni singolo prodotto (di ogni xml) e' diventato una riga in nuova tabella (generata al volo).

Ricomponendo i singoli tasselli, si puo' ben immaginare quali siano le possibilita' offerte.
Si possono creare query annidate, generare nuovi xml (senza la necessita' di elaborarli via codice), legare le query con variabili esterne oppure fra di loro, etc etc.


strumenti utilizzati
-SQL Server 2005 Express
-Notepad2

Commenti
Nome

Sito web
Commento


indietro