Accueil > Trucs & astuces > La gestion des doublons avec SSIS

La gestion des doublons avec SSIS

Plusieurs techniques existent permettant de détecter et traiter des lignes en doublon avec Microsoft SQL Server Integration Services (SSIS).

La plupart des ressources sur le web proposent de gérer ce point uniquement avec du SQL dans la source de données, certaines proposent même de passer par des tables temporaires.

Je vous propose ici une solution rapide à mettre en œuvre tout en bénéficiant des avantages de SSIS en termes de maintenance, de performance et de lisibilité en phase de développement.

Cette solution répond au besoin suivant :

  • Ma table cible doit être alimentée avec des lignes uniques par rapport à une clé,
  • Dans le cas où des doublons sont rencontrés, l’une des lignes doit être conservée,
  • Les doublons peuvent être identifiés et éventuellement stockés dans une table de rejet.

Ce cas est notamment rencontré lorsque l’on charge un référentiel client. Souvent, la base client doit être la plus complète possible mais dans le cas où la donnée serait dupliquée, on ne souhaite ni dupliquer le client ni perdre la trace de son existence. On appliquera alors une règle fonctionnelle permettant de déterminer la version du client à conserver en cas de doublon (le numéro de création le plus élevé ou la date de mise à jour la plus récente par exemple).

clip_image002

1 : Contrôle de doublon avec conservation de l’une des lignes du doublon

1) DOUBLON : Source contenant potentiellement des doublons

2) Contrôle doublon : Recherche effectuée avec les paramétrages spécifiques suivants :

a. Onglet Général : « Rediriger les lignes en erreur vers la sortie sans correspondance »

b. Onglet Connexion : requête sur la même table que la source DOUBLON permettant de renvoyer l’ensemble des lignes qui ne sont pas en doublon et, pour les lignes en doublon, la ligne qui devra être conservée. La requête est construite comme suit :

select CLE, max(COND) COND from doublon group by CLE

Où CLE correspond à la ou les colonnes constituant la clé sur laquelle le test d’unicité est effectué, COND correspond au critère permettant de choisir la ligne à conserver en cas de doublon (numéro de création, date de mise à jour…). Selon les cas, le Max peut être remplacé par un Min.

c. Onglet Colonne : Faire la jointure sur la ou les colonnes CLE et COND

3) Le flux de sortie « Sortie de recherche avec correspondance » fournit les lignes non doublonnées ainsi que la ligne devant être conservée en cas de doublon.

4) Le flux de sortie « Sortie de recherche sans correspondance » fournit les lignes qui sont doublonnées, qui pourront ensuite être insérées dans une table de rejet.

Remarque : Dans le cas où la présence de doublons doit interrompre le chargement, on pourra implémenter un compteur de nombre de lignes sur la branche « sortie sans correspondance » qui, s’il est différent de 0 bloquera la suite de l’exécution.

Autres solutions permettant de traiter des doublons :

  • Utilisation du composant MSDN : http://msdn.microsoft.com/fr-fr/library/ms160916%28SQL.90%29.aspx (je ne l’ai personnellement pas testé).
  • Utilisation de la tâche de Tri et de l’option « Supprimer les lignes avec valeurs de tri en double » : L’avantage de cette solution est sa simplicité de mise en œuvre, son inconvénient est qu’elle ne permet pas de récupérer les lignes en doublon.
  • Utilisation des composants multidiffusion, agrégation, jointure pour reproduire un fonctionnement identique à la requête SQL présente dans le lookup de la solution présentée ci-dessus. L’avantage de cette solution est qu’elle est uniquement basée sur l’utilisation de composants SSIS, son inconvénient est qu’elle est un peu plus longue à développer et ses performances sont un peu moins bonnes.
Categories: Trucs & astuces Tags: ,
  1. 13/01/2010 à 16:11 | #1

    Merci pour ce petit « best-of » Alexis.

    Effectivement, s’il n’y a pas besoin de garder une traces des doublons, l’option dans le tri est bien pratique.
    Par contre, ne pas oublier que justement, c’est un tri et que donc cela à des conséquences en terme de performances.

    Thomas.

  2. Unkown
    30/04/2013 à 13:34 | #2

    Bonjour je vous remercie pour ce tutorial utile ! mais j’ai du mal à m’en servir !
    Je veux remplacer les composants multidiffusion, agrégation, jointure par lookup mais dans mon cas je m’en servis de trois champs et le numéro de la ligne voici ma requête SQL

    select CHAMPS1,CHAMPS2, CHAMPS3
    MIN(RowNumber) as RowNumber
    from
    ( select
    ROW_NUMBER() OVER (ORDER BY CHAMPS1,CHAMPS2, CHAMPS3 ) AS RowNumber
    ,tbl1CHAMPS1,tbl2.CHAMPS2, tbl2.CHAMPS3

    FROM
    tbl1
    INNER JOIN tbl2
    ON tbl1.ID = tbl2.id
    ) temp

    group by CHAMPS1,CHAMPS2, CHAMPS3
    order by RowNumber asc

    Mais cette requête selectionne à partir de la base de données cad que j’aurais des Rownumbre différent y’a t-il pas moyen de sélectionner directement des données extraites dans l’OLE DB SOURCE

  1. Pas encore de trackbacks