Supporto alle query XML in SQL Server e ADO.NET

di Andrea Zani, in SQL Server,

In un articolo precedente pubblicato su ASPItalia.com si mostrava come ottenere il risultato di una query in formato XML con SQL Server 2000. Uno dei difetti nell'uso di quel tipo di query consisteva nella difficoltà di sintassi, soprattutto nel caso di più tabelle collegate in join. Dalla versione 2005 in poi le cose sono fortunatamente migliorate e la sintassi si è semplificata notevolmente. Tra le migliorie si sono avuti un aumento delle prestazioni e l'aggiunta di un campo apposito "XML" per questo tipo di dati. Prima di entrare nel dettaglio vediamo lo schema di un database (figura 1), incluso nell'allegato, a cui faremo riferimento per gli esempi futuri e per l'esempio della web application finale.

Figura 1

Questa struttura merita una minima descrizione data la sua semplicità. La tabella principale è "film" che contiene una semplice lista di film con le informazioni essenziali come il nome del regista, la durata del film, l'anno di uscita. Essa è collegata tramite una relazione uno a uno con la tabella "genere" che specifica il genere cinematografico del film e mediante una relazione uno a molti con la tabella "film_attori" che collega la tabella "film" ad "attori", dato che un film può avere più attori così come ogni attore può aver interpretato più film.

Dalla versione 2000 alla 2005/8 di SQL Server

Facendo un passo indietro, vediamo la stessa query realizzata con la versione 2000 e con la 2005/8. Innanzitutto nella figura 2 vediamo il risultato della query che vogliamo ottenere:

Figura 2

Come già detto all'inizio di questo articolo, la complessità della sintassi con SQL Server 2000 la si aveva con query complesse riguardanti più tabelle collegate. L'unico modo per ottenere l'XML come quello mostrato nella figura 2 era con l'utilizzo dell'"xml explicit" nella query:

select 1 as Tag, null as Parent, null as [ArrayOffilm!1!], null as [ArrayOffilm!1!ordine1!hide]
, null as [ArrayOffilm!1!ordine2!hide]
, null as [film!2!id], null as [film!2!titolo_film], null as [film!2!regista], null as [film!2!durata], null as [film!2!anno], null as [film!2!id_genere]
, null as [genere!3!id], null as [genere!3!genere]
, null as [attori!4!], null as [attori!5!id], null as [attori!5!nome_attore]
union all select 2, 1, 1, 1, 1, [film].[id], [film].[titolo_film], [film].[regista], [film].[durata], [film].[anno], [film].[id_genere], null, null, null, null, null from [film] as [film]
union all select 3, 2, 1, 2, 1, [film].[id], [film].[titolo_film], [film].[regista], [film].[durata], [film].[anno], [film].[id_genere], [genere].[id], [genere].[genere], null, null, null from [film] as [film] inner join [genere] as [genere] on [film].[id_genere]=[genere].[id]
union all select 4, 2, 1, 1, 2, [film].[id], [film].[titolo_film], [film].[regista], [film].[durata], [film].[anno], [film].[id_genere], null, null, null, null, null from [film] as [film]
union all select 5, 4, 1, 1, 3, [film].[id], [film].[titolo_film], [film].[regista], [film].[durata], [film].[anno], [film].[id_genere], null, null, null, [attori].[id], [attori].[nome_attore] from [film] as [film] inner join [film_attori] as [film_attori] on [film].[id]=[film_attori].[id_film] inner join [attori] as [attori] on [film_attori].[id_attore]=[attori].[id]
order by [ArrayOffilm!1!], [film!2!id] asc, [ArrayOffilm!1!ordine1!hide], [genere!3!id] asc, [ArrayOffilm!1!ordine2!hide], [attori!5!id] asc for xml explicit

Una complessità simile non la si aveva dai tempi dai recordset gerarchici con il data shaping introdotti con l'ADO 2.1 e che furono abbandonati. Per maggiori informazioni su questa sintassi si rimanda all'articolo citato precedentemente.

5 pagine in totale: 1 2 3 4 5

Attenzione: Questo articolo contiene un allegato.

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