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!