SSIS: come migrare un Data Driven Query Task

giovedì 24 luglio 2008 - 12.42

kloor Profilo | Newbie

Salve a tutti!
Mi occupo di integrazione dati e BI e di riflesso SQLserver e mi auguro in futuro di poter dare il mio contributo... oggi inauguro però con una domanda sui SSIS. Premetto che vengo dal mondo dei DTS, non mi occupo di programmazione (VB, quel tanto che basta) e solo mettendo le mani sui SSIS ho cominciato ad entrare in contatto con .NET...
Il consiglio che vi chiedo è: come migrare il Data Driven Query Task agli IS?
Chiaro che ciò dipende dall'uso che uno ne fa. Ebbene, io lo utilizzavo per trasferire dati tra 2 distinti DB quando volevo aggiornare tabelle di dati simili senza un TRUNCATE/INSERT completo, ma valutando, tramite lookup sulla chiave nel db di destinazione, se il record era già presente e comportandomi di conseguenza: eseguendo cioè un UPDATE dei campi correlati in caso affermativo o una INSERT se la chiave non risultava presente.
Andando avanti per intuizione ho utilizzato un For Each Loop container (per ogni riga da trasferire) al cui interno ho messo un Data Flow con un Lookup ed un OLEDB Command o Destination a seconda del risultato del Lookup. Purtroppo questa modalità si rivela estremamente leeeenta, impiegando almeno un secondo per riga. Avendo tabelle con millemila righe mi vien male a pensarci
Ci sono alternative possibili secondo voi?
Oppure (girando la frittata) sbaglio qualche impostazione nel pacchetto (a.e. ho provato a cambiare il BypassPrepare, delayvalidation senza successo)?

Grazie per l'aiuto ;)
M.

kloor Profilo | Newbie

Che semo!
Mi ero dannato a cercare nel forum qualche risposta e la trovo nel thread di fianco... come non detto...
O Lookup o sproc, pare non ci siano alternative.
Ciao,
M.
M.

alx_81 Profilo | Guru

>Mi ero dannato a cercare nel forum qualche risposta e la trovo nel thread di fianco... come non detto...
>O Lookup o sproc, pare non ci siano alternative.
eheh.. mi sembra di averlo già visto
Benvenuto su dotnethell!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

alx_81 Profilo | Guru

>Ci sono alternative possibili secondo voi?
Sai che però ho pensato che forse un modo più veloce c'è?
Se i dati sono su due db distinti, potresti fare tutto senza lookup.
Potresti pensare di utilizzare l'Execute SQL Task sul control flow, facendo magari un linked server. In questo modo, potresti fare una UPDATE FROM (con la join sulla chiave che avresti usato per il lookup) di tutti gli "uguali", andando ad inserire direttamente senza controlli quelli che non rispettano la join..
In poche parole due Execute SQL Task, uno che fa la update degli uguali e uno che fa la insert dove la join non si verifica.. una semplice left join. Due operazioni set based, e riduzione dello stress macchina/cpu..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kloor Profilo | Newbie

Ciao Alx e grazie per la risposta...
In effetti parlando di sproc pensavo proprio a due query consecutive UPDATE ed INSERT appunto:

UPDATE destTable
set dest1=source1, ...
FROM sourceTable INNER JOIN destTable ON sourcePK=destPK;

INSERT INTO destTable
SELECT source1, source2, ...
FROM sourceTable LEFT OUTER JOIN destTable ON sourcePK=destPK

Poi tutto impacchettato o in un unica sproc ed OLEDB Command oppure come suggerisci tu in 2 distinti Execute SQL Task.
A pelle meglio la seconda... senza particolari ragioni oggettive ;)

M.

alx_81 Profilo | Guru

>Poi tutto impacchettato o in un unica sproc ed OLEDB Command
>oppure come suggerisci tu in 2 distinti Execute SQL Task.
Io ne farei due solo per ragioni di modularità e di eventuale rilascio distribuito o manutenzione..
Puoi cambiare logica su una e non sull'altra cambiando solo una delle sp, ma puoi decidere tu
Poi c'è anche il log, che potrebbe essere comodo, ma anche quello sta a te definirlo o meno dentro alle sp o al ssis..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5