Voir le flux RSS

Elros - Bienvenue dans le monde de la Business Intelligence

[Actualité] Comment gérer dans SSIS le mode d'alimentation Insert or Update ?

Noter ce billet
par , 07/04/2015 à 16h40 (1391 Affichages)
Bonjour,

Sur SSIS, il n'existe pas de composant prêt à l'emploi gérant l'alimentation en mode Insert or Update. Il existe plusieurs astuces pour régler ce problème dont celle que je vais présenter ci-dessous.

Voici un exemple de data flow gérant l'insertion ou la mise à jour de données.

Nom : Dataflow.jpg
Affichages : 2316
Taille : 35,8 Ko

Le lookup permet d'identifier les lignes présentes dans la cible et de les envoyer dans la branche "Match OutPut". Le cas échéant, elles sont envoyées en insertion dans la branche "No Macth OutPut".
Dans le lookup, nous jointons nos deux tables sur la clé primaire d'un véhicule (ici l'immatriculation du véhicule). Par la suite, nous récupérons l'ensemble des champs que l'on souhaiterait mettre à jour (Nom du loueur, nombre de km, etc.).

Dans le composant colonne dérivée (Checking for update), nous allons tester nos champs sources avec les champs récupérés dans le lookup. Ce qui nous donne ceci :

Nom : derived.jpg
Affichages : 1593
Taille : 74,3 Ko

La formule est simple et permet de tester les valeurs NULL qui peuvent poser des problèmes.
La formule en question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
(ISNULL(LKP_Name) != ISNULL(SRC_Name)) || (!ISNULL(LKP_Name) && !ISNULL(SRC_Name) && LKP_Name != SRC_Name)
Cette formule nous permet de créer un booléen qui nous permettra avec le composant de fractionnement conditionnel de récupérer seulement les lignes à mettre à jour.
La formule ci-dessous sera insérée dans la sortie "AnyChange" et vérifiera si au moins un champ a évolué. Si c'est le cas, la ligne entière sera mise à jour :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Changed_NBKM || Changed_Name
Enfin, le composant OLE DB Commande permettra de mettre à jour nos lignes qui passeront la condition "AnyChange".
Il y'a trois paramétrages à effectuer :
- Choisir la connexion
- Mettre la commande SQL avec les paramètres (sur ssis les paramètres sont sous la forme d'un point d'interrogation) à la place des valeurs à mettre à jour
- Faire le mapping des paramètres avec les colonnes que l'on souhaite (la source Src voiture)

Nom : OLE DB.jpg
Affichages : 1615
Taille : 101,1 Ko

Voilà, maintenant vous êtes capable de gérer une méthode d'Insert or update. Il y'a évidemment d'autres méthodes pour gérer cette méthode d'alimentation.

Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Viadeo Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Twitter Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Google Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Facebook Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Digg Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Delicious Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog MySpace Envoyer le billet « Comment gérer dans SSIS le mode d'alimentation Insert or Update ? » dans le blog Yahoo

Commentaires

  1. Avatar de Slaveak
    • |
    • permalink
    Bonjour Elros,

    J'ai essayé ta méthode pour remplacer mes "Slowly Changing Dimension Transformation", et effectivement c'est clairement plus efficace ! c'est vraiment impressionnant ! je fais x100 en terme de rapidité de traitement et je peux enfin gérer des grosses volumétrie en upsert !

    J'ai tout de même quelques questions sur le sujet (et espérant que ça serve à d'autres que moi...) :
    - On ne peut pas inclure une requête en MERGE c'est bien ça ? (pour info j'ai tenté mais on ne peut mapper les params de la commande OLEDB que sur une seule colonne, enfin j'ai pas réussi du moins)
    - J'ai un peu du mal à capter comment marche l'entrée sans correspondance... ce qui signifie que si je n'arrive pas à faire la jointure alors je balance la ligne sur le choix que j'ai fais sur le menu déroulant? en l'occurrence Sortie de recherche sans correspondance (et donc je dirais, comportement attendu de ce genre de composant...).
    Mais je comprends pas un truc... en temps normal il y a une entrée avec correspondance, la jointure réussie, alors à quoi sert la sortie sans correspondance ? pareil pour la sortie erreur ? En fait la sortie erreur ne sert qu'a gérer les vrais Exception due au composant ?

    En espérant avoir été clair dans mes questions.

    Slaveak
  2. Avatar de Elros
    • |
    • permalink
    Je ne suis pas certain d'avoir saisi toutes tes questions.

    Pour le Merge, tu as qu'une seule clé de jointure (tu peux tricher avec des colonnes dérivées en concaténant deux colonnes mais bon ça fait bricolage). De plus, pour le Merge et le Merge join, tu dois forcément avoir tes deux branches triées.

    Pour l'entrée sans correspondance, on faire avec un exemple concret ;-)
    Image que tu aies d'un côté une dimension Temps (avec les champs SK_DimTemps et DT_Jour) avec tous les jours de 2000 à 2020 et que de l'autre tu aies une table de fait Facture (avec le champ DT_JourFacture).
    Pour récupérer ta clé technique (SK_DimTemps ) de ta dimension Temps, tu dois joindre DT_JourFacture avec DT_Jour.

    Maintenant, image qu'une facture arrive avec une date 08/10/2025. Tu ne trouveras pas ta clé technique dans la dimension Temps car on s'arrête à l'année 2020.
    Du coup, tu peux gérer cette "anomalie" de plusieurs façon :
    - Mettre le package en erreur, ton flux s'arrête
    - Ignorer l'erreur et continuer le flux (tu n'auras pas ta ligne à la fin)
    - Récupérer l'erreur de la ligne pour la stocker dans les logs par exemple
    - Récupérer la ligne en "erreur" pour la réinjecter avec une clé technique à -1 par exemple

    Pour les sorties en erreur c'est la même idée, cela permet de savoir s'il y'a eu un problème et/ou récupérer l'erreur.

    En espérant avoir pu t’éclairer.

    Elros