Update or Insert sur SSIS avec un Lookup simple
Par Laurent Capin <Head in the cloud, Feet on Azure> le jeudi 17 juin 2010, 15:37 - .NET - Lien permanent
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.
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 :
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

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

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.

Nous utiliserons pour cela 4 objets :
- un OLE DB Source
- un Lookup
- un OLE DB Command
- 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 :

Puis sélectionner les données qui nous intéressent :

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 :

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) :

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
:

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 :

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 :

L'insert
Pour l'insert, c'est encore plus simple. Une boite OLE DB Destination suffit
:

On a fait pointé la boite sur la table "DEST", il n'y a plus qu'à mapper les
colonnes :

Et oh joie, oui c'est fini. Un petit F5 et on teste :

Et on a enfin un peu de couleur dans ce billet qui jusque là était un peu
gris...
