SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Output XML e ROOT Node con Execute SQL Task

L'Execute SQL Task consente di ritornare ResultSet di vario tipo. Ricordiamo che le tipologie disponibili sono:

- None
- Single Row: Ovvero una singola riga del resultset
- Full Result Set: Ovvero l'intera tabella
- XML: Ovvero un file XML (SQL con clausola FOR XML)

In questo caso vorrei soffermarmi su XML.
Prendiamo un semplicissimo esempio di riferimento. Configuriamo un Execute SQL Task nel seguente modo:



Utili è un connection manager configurato su un mio DB locale. Lo statement SQL utilizzato come direct input è una query che utilizza la clausola FOR XML.
In assenza di questa clausola si otterrebbe comunque un XML ma contenente l'errore seguente:

<ROOT>

  <?MSSQLError HResult="0x80004005" Source="Microsoft XML Extensions to SQL Server" Description="No description provided"?>

</ROOT>


La query passata invece è la seguente:

SELECT * FROM

(

SELECT

    1 as C1, 2 as C2

UNION

SELECT

    3 as C1, 4 as C2

UNION

SELECT

    5 as C1, 6 as C2

UNION

SELECT

    7 as C1, 8 as C2

) T

FOR XML AUTO


In questo modo l'XML ritornato dall'execute SQL Task è il seguente:

<ROOT>

  <T C1="1" C2="2"/>

  <T C1="3" C2="4"/>

  <T C1="5" C2="6"/>

  <T C1="7" C2="8"/>

</ROOT>


Ovvero l'XML che ci si aspettava all'inizio.. Anche se in realtà non è proprio così..
Notate cosa c'è in testa ed alla fine. Un nodo ROOT ed uno /ROOT.
Questo può essere di aiuto nel caso in cui la query sia simile a quella scritta sopra, e quindi con una clausola FOR XML "semplice".
Provate ora a mettere nello statement questa query:

SELECT * FROM

(

SELECT

    1 as C1, 2 as C2

UNION

SELECT

    3 as C1, 4 as C2

UNION

SELECT

    5 as C1, 6 as C2

UNION

SELECT

    7 as C1, 8 as C2

) T

FOR XML AUTO, ROOT('MioNodo')


Come si può facilmente notare, è stato definito un nodo root col nome MioNodo, quindi dall'esecuzione otterremo un XML fatto così:

<ROOT>

  <MioNodo>

    <T C1="1" C2="2"/>

    <T C1="3" C2="4"/>

    <T C1="5" C2="6"/>

    <T C1="7" C2="8"/>

  </MioNodo>

</ROOT>

Ancora una volta, nonostante io abbia definito un mio nodo di radice, il ROOT node viene aggiunto comunque.
Qualunque sia il nome che indichiamo nell'opzione ROOT L'execute SQL Task aggiungerà il nodo radice di default..
Ora, se non lo si vuole, l'unico modo per non aver quel nodo è utilizzare uno script task e rimuoverlo..
Per chi ha SQL Server 2008 e si sta illudendo che esista la soluzione, beh.. brutte notizie. Il comportamento rimane lo stesso. A quanto pare il parsing dell'xml non viene nemmeno effettuato.
Provate a dare una letta qui.
Comportamento discutibile, non trovate?

Stay Tuned!

Categoria: SSIS 2008 tips
domenica, 09 nov 2008 Ore. 17.57
Statistiche
  • Views Home Page: 586.466
  • Views Posts: 1.044.089
  • Views Gallerie: 611.072
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003