La problématique :

Déverser certaines données d'une table source vers une table destination en évitant les doublons. La table source pourrait par ailleurs être un fichier plat ou un service web mais le sujet n'est pas là.
Dans SSIS l'objet qui adresse cette problématique est le "Lookup". J'ai pas mal cherché dans les forums, c'est rarement détaillé comme j'aime, c'est à dire en images. Je me lance donc, et là c'est une vrai BD, accrochez-vous. Voyons en détail comment mettre en place un Lookup simple dans SSIS.

Les Tables

Nous avons pour le besoin du test créé deux tables, une table source et une table destination :
Table Source
Table Destination
Jusque là rien de bien effrayant.
Maintenant, ouvrons le BIDS !
- Ah, ça y est, ça tourne au film d'horreur.
- mais non ! Le BIDS, c'est le Microsoft Sql Server Business Intelligence Development Studio.
Et créons un nouveau projet :

Le projet SSIS

Création projet
Et dans le package dtsx par défaut (pas la peine de chercher midi à 14h ici) créons une tâche de flux de données "Data Flow Task :

Le Data Flow

Data Flow Task

C'est cette tâche qui va extraire les données de la table source, les filtrer et soit insérer, soit mettre à jour les données dans la table destination.

Data Flow Details

Nous utiliserons pour cela 4 objets :

  1. un OLE DB Source
  2. un Lookup
  3. un OLE DB Command
  4. un OLE DB Destination


Le but ici étant de faire simple. Dans le cadre d'une base source ou destination SQL Server, des objets optimisés sont disponible, comme le SQL Server Destination.

OLE DB Source

On glisse donc dans la fenêtre de design un objet OLE DB Source dans lequel on va régler la source justement :
Source 1
Puis sélectionner les données qui nous intéressent :
Source 2

Lookup

Ensuite on glisse un objet Lookup, et on lie la sortie verte (le Data Flow path) du la boite OLE DB Source à la boite Lookup. Et l'on règle deux choses : Les données de référence et le comportement sur les colonnes.
Le réglage de la source :
Lookup Reference Table
J'ai privilégié un simple "select" sql ici car je le trouve plus parlant. On pourra bien sûr passer par l'option "Use a table or a view".
Maintenant le réglage des colonnes (enfin de la colonne, dans notre cas simplissime) :
Lookup Column

Le réglage du comportement sur erreur du Lookup

Ne surtout pas oublier de cliquer sur "Configure Output Error" du Lookup. Sinon il bloque le traitement sur chaque ligne qui ne correspond pas au lookup, donc sur chaque ligne qu'il ne trouve pas dans la table de destination.
Il y a deux cases à changer : elles sont en rouge dans l'image suivante :
Lookup Errors

L'Update

En sortie du Lookup, deux choix, les lignes qui correspondent à la requête du Lookup et celles qui ne correspondent pas. Celles qui correspondent, et qui sont donc déjà dans la table de destination (en tout cas dont l'ID correspond), doivent donc faire l'objet d'un update pour rafraichir la table destination. On glisse donc un objet OLE DB Command :
OLE DB Command 1
On l'a connecté à la sortie de la boite Lookup.
Et On règle la SQL Command avec l'update qui va bien. Ensuite on paramètre le mapping des colonnes de l'update avec les sorties du Lookup :
MappingUpdate

L'insert

Pour l'insert, c'est encore plus simple. Une boite OLE DB Destination suffit :
OLEDBDEstination1
On a fait pointé la boite sur la table "DEST", il n'y a plus qu'à mapper les colonnes :
MappingDestination
Et oh joie, oui c'est fini. Un petit F5 et on teste :
F5
Et on a enfin un peu de couleur dans ce billet qui jusque là était un peu gris...