L’UPSERT est une fonctionnalité couramment utilisée dans les ETL à mis chemin entre l’instruction INSERT et UPDATE. Elle consiste à insérer une ligne de données si celle-ci n’existe pas en base, ou sinon à la mettre à jour. Le SQL « officiel », ainsi que SQL Server ne proposent pas d’opérateur dédié à cette opération. Il semblerait que SQL Server 2008 ait ce type d’opérateur en gestation, mais ce n’est pas l’objet de ce post.
Les méthodes de réalisation d’UPSERT font régulièrement l’objet d’analyse sur le web. Après moult lectures, et essais, voici ma méthode, efficace dans la grande majorité des cas.
L’exemple fait référence à mon précédent article sur « SSIS et les mises à jour de masse ».
Le principe est de disposer d’un flux de données réalisant
• l’insertion de masse des lignes adéquates,
• l’insertion en table temporaire des lignes à modifier
Puis une requête SQL pour réaliser la mise à jour par jointure (voir mon article « SSIS et les mises à jour de masse).
Voici le flux de contrôle :
Voici le flux de données associé :
On retrouve la « recherche » du nom et prénom. Il est important de noter que la gestion des erreurs de cette recherche est configurée sur « Ignorer l’échec » de la façon suivante:
Cela signifie que si la recherche de la clé primaire n’aboutie pas, celle-ci est positionnée à la valeur NULL dans le flux de données.
Dès lors, il est possible de départager les lignes à insérer ou à mettre à jour avec un composant de « Fractionnement conditionnel » de la sorte :
Laisser un commentaire