SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

SSIS 2008 - Lookup No Match Output

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:

SCENARIO
immaginiamo 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 2005
Come 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 2008


Molte 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!

Categoria: SSIS 2008 Basics
martedì, 06 ott 2009 Ore. 17.35
Statistiche
  • Views Home Page: 482.848
  • Views Posts: 870.772
  • Views Gallerie: 500.643
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003