Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
SSIS Recordset destination
martedì 22 giugno 2010 - 11.16
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
squilibrium
Profilo
| Junior Member
168
messaggi | Data Invio:
mar 22 giu 2010 - 11:16
Ciao a tutti
Io ho un Dataflowtask dove i record alla fine vengono inseriti dentro un recordset destination (ovverosia una variabile).
Ora dovrei creare un nuovo dataflowtask che abbia come source proprio il recordset inserito nella variabile. Il problema è che non riesco a trovare un Data Flow Sources che mi consenta di fare questa operazione.
Qualcuno ha qualche idea?
Grazie
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mar 22 giu 2010 - 20:12
>Ciao a tutti
Ciao
>Io ho un Dataflowtask dove i record alla fine vengono inseriti
>dentro un recordset destination (ovverosia una variabile).
>Ora dovrei creare un nuovo dataflowtask che abbia come source
>proprio il recordset inserito nella variabile. Il problema è
>che non riesco a trovare un Data Flow Sources che mi consenta
>di fare questa operazione.
>Qualcuno ha qualche idea?
è tutto normale, non esiste un recordset source, e questo perchè il recordset destination è stato progettato per salvare in memoria il resultset, per poi poter tornare nel control flow e gestire i dati tramite Foreach con enumeratore ADO. Quindi usa un bel Foreach loop se devi gestire queste informazioni. Se non era tua intenzione, dovrai cambiare approccio. In tal caso ti invito di spiegare un po' più in dettaglio il caso che devi gestire.
>Grazie
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
squilibrium
Profilo
| Junior Member
168
messaggi | Data Invio:
mer 23 giu 2010 - 09:52
Ciao
Non posso usare il foreach perchè i record da gestire sono troppi.
In pratica ho un flusso di dati che viene da un database esterno, su questo flusso devo fare delle lookup e "appoggiarmi" il recordset (con i risultati delle lookup) da una parte. Alla fine devo prendere i dati da questo recordset e inserirli in una tabella.
Il problema è che a seconda del numero dei record presenti nel recordset devo far partire un dataflow piuttosto che un altro. questo perchè nel recordset io posso trovarmi 1000 record come posso trovarmene 12 mln. Se i record sono molti uso un approccio di caricamento ad hoc mentre se sono pochi effettuo dei semplici insert/update sulla tabella finale.
In sintesi io dovrei passare un recordset da un dataflow ad un altro e volevo cercare di fare tutto in memoria ma mi sembra di capire che non è possibile. Potrei usare un Raw File o una tabella di appoggio ma avrei preferito usare la memoria per motivi di performance.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 23 giu 2010 - 10:48
>Se i record sono molti uso un approccio
>di caricamento ad hoc mentre se sono pochi effettuo dei semplici
>insert/update sulla tabella finale.
che ne dici di fare un controllo sul conteggio prima di eseguire il dataflow? Alla fine mi pare di capire che se hai più di TOT righe allora devi seguire un altro modo di caricare.
Potresti contare prima e se il conteggio è maggiore di TOT allora lanci un dataflow, in caso contrario lanci l'altro dataflow.
Così splitti e determini tu il tipo di caricamento da fare. Può bastare? Ho capito bene?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
squilibrium
Profilo
| Junior Member
168
messaggi | Data Invio:
mer 23 giu 2010 - 11:13
Potrebbe andare ma poi dovrei fare le lookup su entrambi i dataflow (replicandole) e non mi piace tanto.
Alla fine mi sono buttato su una soluzione che lascia il tempo che trova:
- Conteggio i record e mi salvo la count su una variabile (nRec)
- avvio il dataflow e prendo i dati da importare
- faccio le lookup
- controllo il numero dei record (conditional split)
- se nRec è inferiore alla soglia faccio insert/update
- se nRec è superiore faccio un'altra strada.
Il fatto è che per il caricamento massivo (l'altra strada per capirsi), devo effettuare lo switch della partizione sulla quale caricare i dati. Lo switch però lo posso fare solo FUORI dal dataflow in quanto è un singolo comando sql e quindi lo devo richiamare fuori nel controlflow prima di entrare nel dataflow.
A questo punto ho 2 possibilità:
1) faccio lo switch-out della partizione sempre e poi dopo il dataflow faccio lo switch-in
2) controllo il numero dei record e se è superiore alla soglia faccio lo switch-out prima e lo switch-in dopo
Sono 2 soluzioni che però non mi piacciono. La prima perchè non ha senso spostare una partizione se non serve. La seconda perchè vuol dire immettere in punti diversi del flusso di caricamento una stessa condizione.
La soluzione che avrei preferito era.
- Prendo i dati da importare, gli faccio le lookup e li salvo su un recordset
- controllo il numero dei record
- se inferiore alla soglia lancio dataflow di update
- se superiore alla soglia faccio
switch-out della partizione
dataflow di caricamento
switch in della partizione caricata
Ho visto però che il recordset destination non posso poi riutilizzarlo come source anche se mi appoggio il tutto su una variabile. Dovrei quindi utilizzare un raw file o una tabella di appoggio ma a quel punto ci perdo di performance in quanto faccio doppia scrittura e lettura dal disco e in più non so come puo comportarsi il raw file con oltre 10-15 mln di record.
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 23 giu 2010 - 11:25
>Potrebbe andare ma poi dovrei fare le lookup su entrambi i dataflow
>(replicandole) e non mi piace tanto.
>Alla fine mi sono buttato su una soluzione che lascia il tempo
>che trova:
>
>- Conteggio i record e mi salvo la count su una variabile (nRec)
>- avvio il dataflow e prendo i dati da importare
>- faccio le lookup
>- controllo il numero dei record (conditional split)
>- se nRec è inferiore alla soglia faccio insert/update
>- se nRec è superiore faccio un'altra strada.
era proprio quello che intendevo
, e non la trovo una brutta soluzione
>Il fatto è che per il caricamento massivo (l'altra strada per
>capirsi), devo effettuare lo switch della partizione sulla quale
>caricare i dati. Lo switch però lo posso fare solo FUORI dal
>dataflow in quanto è un singolo comando sql e quindi lo devo
>richiamare fuori nel controlflow prima di entrare nel dataflow.
eh sì, le partizioni sono delicate in questo senso..
>A questo punto ho 2 possibilità:
>1) faccio lo switch-out della partizione sempre e poi dopo il
>dataflow faccio lo switch-in
>2) controllo il numero dei record e se è superiore alla soglia
>faccio lo switch-out prima e lo switch-in dopo
>
>Sono 2 soluzioni che però non mi piacciono. La prima perchè non
>ha senso spostare una partizione se non serve. La seconda perchè
>vuol dire immettere in punti diversi del flusso di caricamento
>una stessa condizione.
>
>La soluzione che avrei preferito era.
>- Prendo i dati da importare, gli faccio le lookup e li salvo
>su un recordset
>- controllo il numero dei record
>- se inferiore alla soglia lancio dataflow di update
>- se superiore alla soglia faccio
> switch-out della partizione
> dataflow di caricamento
> switch in della partizione caricata
>
>Ho visto però che il recordset destination non posso poi riutilizzarlo
>come source anche se mi appoggio il tutto su una variabile. Dovrei
>quindi utilizzare un raw file o una tabella di appoggio ma a
>quel punto ci perdo di performance in quanto faccio doppia scrittura
>e lettura dal disco e in più non so come puo comportarsi il raw
>file con oltre 10-15 mln di record.
Personalmente, quando ho lavorato con le partizioni, ho sempre fatto una tabella speculare alla destinazione non partizionata (una staging) popolandola col processo. In quel modo il popolamento era solo sulla tabella di staging. Alla fine di tutto, switch della tabella sulla partizione, ed eventuale switch out della vecchia se devo sostituire. In questo modo puoi anche mettere in seguito dei checkpoint ed, in caso di errore, non effettuare il primo caricamento in staging, tenendo di fatto traccia di quello che hai fatto.
Non hai una grande libertà in questo senso. Il dataflow è comodo, ma per certi versi anche limitante. Di certo fare un processo sql è sempre più scomodo, mentre con ssis hai veramente molti vantaggi sia in sviluppo, sia in manutenzione, sia in velocità di implementazione.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
squilibrium
Profilo
| Junior Member
168
messaggi | Data Invio:
mer 23 giu 2010 - 11:33
Io personalmente mi trovo bene con SSIS e lo uso molto spesso per il caricamento di grosse moli di dati. In questo caso specifico però e forse anche in qualche caso passato, ho notato che sarebbe molto utile avere la possibilità di lanciare comandi SQL SINGOLI all'interno di un dataflow, mentre ora se metti un sql task te lo esegue per ogni record del flusso. Alla fine una soluzione si trova sempre anche se ti fà perdere un pò in eleganza...
grazie mille per la disponibilità
Ciao
alx_81
Profilo
| Guru
8.814
messaggi | Data Invio:
mer 23 giu 2010 - 11:38
>Io personalmente mi trovo bene con SSIS e lo uso molto spesso
>per il caricamento di grosse moli di dati. In questo caso specifico
>però e forse anche in qualche caso passato, ho notato che sarebbe
>molto utile avere la possibilità di lanciare comandi SQL SINGOLI
>all'interno di un dataflow, mentre ora se metti un sql task te
>lo esegue per ogni record del flusso. Alla fine una soluzione
>si trova sempre anche se ti fà perdere un pò in eleganza...
dico sempre quando ne parlo: "pensa a dts, a quello che NON avevi, alle imprecazioni per raggiungere una soluzione".
Forse un unico comando all'interno del dataflow poi non ha tutto questo senso, in fondo è fatto per gestirti una sorgente in automatico.
Magari si potrebbe parlare di eventi, tipo scatenare un evento se voglio inserire un record solo, ecc..
ma nel dataflow non metterei qualcosa di puntuale.. ma questa è solo un'opinione personale.
>grazie mille per la disponibilità
figurati, sempre un piacere
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Torna su
Stanze Forum
Elenco Threads
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 !