sux_stellino
Archivio Posts
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
Calendario
maggio 2013
lmmgvsd
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

*****

*****

*****


*****


*****

*****

*****


*****



*****



*****



*****


Mappa
Statistiche
  • Views Home Page: 214.580
  • Views Posts: 401.030
  • Views Gallerie: 278.538
  • n° Posts: 373
  • n° Commenti: 272
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003