Una delle nuove funzionalità di SSIS 2008 è il
No Match Output del
lookup transformation task. Prima, per gestire il match mancato era
necessario utilizzare il path "rosso", ovvero l'error output del lookup
task. Un caso di utilizzo può essere il seguente:
SCENARIOimmaginiamo
di avere una tabella di utenti in cui sono salvate anche le
informazioni di contorno dell'utente stesso. Ipotizziamo la seguente
tabella:
CREATE TABLE dbo.Utenti
(
IDUtente int NOT NULL PRIMARY KEY CLUSTERED
, Nome varchar(50) NOT NULL
, Cognome varchar(50) NOT NULL
, Indirizzo varchar(100) NOT NULL
, Cap char(5) NOT NULL
)
ed il seguente file di testo, che funge da sorgente:
utenti.txt
1 Alessandro Alpi Via Villani 10 43014
2 Michael Denny Via Roma 20 43039
3 Vincenzo Violante Via Venezia 30 43100
4 Alessandro Verani Via Mantova 40 43100
Ogni
giorno viene letto ed importato questo file contenente le informazioni
sugli utenti. Può quindi succedere che il numero degli utenti vari. Ipotizziamo di voler:
- inserire gli utenti che sono solo sul file di
testo e non sulla tabella
- aggiornare quelli che ci sono già.
Un
classico trattamento incrementale di una tabella.
Inseriamo solo due record sulla tabella, come se l'importazione dal file sia già stata effettuata almeno una volta:
INSERT INTO dbo.Utenti (IDUtente, Nome, Cognome, Indirizzo, Cap)
VALUES (1, 'Alessandro', 'Alpi', 'Via Villani 10', '43014')
INSERT INTO dbo.Utenti (IDUtente, Nome, Cognome, Indirizzo, Cap)
VALUES (2, 'Michael', 'Denny', 'Via Firenze 20', '43039')
Possiamo
notare che questi due record sono i primi due del file, ma
il secondo
cambia per l'indirizzo ("Via Firenze 20" invece di "Via Roma 20"). Quello che
vogliamo ottenere è un caricamento incrementale dal file txt. Il primo record
deve essere lasciato così com'è, il secondo deve aggiornarsi nell'indirizzo, e gli
altri devono essere inseriti come nuovi.
Ecco ora come ci si poteva muovere in SSIS 2005 e successivamente la miglioria introdotta dal 2008:
SSIS 2005Come già accennato, il lookup transformation task di 2005 non possiede altro che il Match Output e l'Error Output. Per questa ragione, dal Match Output "passano" solamente i record che hanno un match con quelli di lookup, mentre dall'errore,
anche quelli che non hanno match. "Anche", perchè l'errore è un qualsiasi errore
, e quindi non necessariamente un lookup mancato
.
In
questo post, ho già parlato del lookup task:
Possiamo notare, che nella versione 2005, il match è il caso "straight", mentre l'errore (con impostato un redirect row) è il "
no match". Di conseguenza, nel nostro caso, in
insert verranno passati solo gli ultimi due record, i primi due invece finiranno in
update, poichè la tabella di destinazione della lookup è la nostra tabella utenti, sul campo ID (il primo nel file):
Eseguendo il ssis otterremo il risultato dell'aggiornamento incrementale.
SSIS 2008Molte sono le migliorie del Lookup task nella versione 2008, ne discute
Jamie Thomson,
qui. Consideriamo il ssis dello screenshot di prima.
Intanto, facendo doppio click sul lookup notiamo già la prima differenza, la schermata della cache e del redirect del nomatch:
qui, troverete la definizione di ogni voce. In questo post ci soffermeremo sulla parte finale, il redirect delle righe:
-
Ignore failure, il no match, per il lookup è un errore, quindi è possibile ignorare il fallimento del match
-
Redirect to error output, per ottenere lo stesso comportamento della versione 2005
-
Fail component, per lanciare un'eccezione
-
Redirect rows to no match output, per il nuovo comportamento.
Con quest'ultima scelta verrà creata una nuova pipe su cui passare i dati risultanti dal mancato match:
Come potete notare la freccia è verde, il lookup, in output, si comporta in questo caso come un multicast limitato a due vie, più l'errore. In questo modo l'errore vero e proprio viene gestito come tale, mentre il no match come una via nuova, con la quale gestire il caso particolare di mancato lookup. Inoltre, vi è anche un altro comportamento. Provando a collegare per la prima volta il nostro lookup, vi verrà richiesto quale output collegare fra i due disponibili:
In ognuno dei due casi abbiamo caricato il file. In 2008 abbiamo quelle opzioni in più che ci permettono di ottimizzare il task. Diciamo che il no match rende più corretta l'interpretazione del workflow e la gestione dell'errore, che rimane separata.
Stay Tuned!