Le Post Infeeny

Les articles des consultants et experts Infeeny

Mettre en place un Upsert avec un LookUp dans SSIS 2012

Problématique

On veut insérer des données d’une table source vers une table de destination en évitant les doublons.
La question est donc de savoir, comment vérifier si que la donnée existe ou non dans la table de destination
et si oui, comment la mettre à jour.

Lot Upsert

Déroulement

Dans un premier temps nous allons créer la table source

CREATE TABLE [dbo].[TableSource](
[souce_id] [int] NOT NULL,
[source_prenom] [nvarchar](50) NULL,
[source_nom] [nvarchar](50) NULL,
CONSTRAINT [PK_Personnes] PRIMARY KEY CLUSTERED
(
[souce_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Avec comme données :

Table Source

Puis la table de destination

CREATE TABLE [dbo].[TableDestination](
[source_id] [int] NOT NULL,
[prenom_destination] [nvarchar](50) NULL,
[nom_destination] [nvarchar](50) NULL,
CONSTRAINT [PK_TableDestination] PRIMARY KEY CLUSTERED
(
[source_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Avec comme données :

Table Destination

Voici ce que nous allons construire comme lot SSIS :

Lot Upsert

Étape 1 : Configuration de la la source (Composant OLE DB Source)

Créez une nouvelle connexion vers la base de données puis sélectionnez la table source.

Composant Source - OLE DB Source

Étape 2 : Configuration du LookUp

  • Connection

Sélectionnez la table destination.
C’est dans ce composant lookup que nous pourrons savoir si les données sources existent ou pas dans la table de destination.

LookUp Connection

  • Columns

Dans cette partie nous allons lier les champs qui permettent de faire les vérifications.
Dans notre cas nous lions, les deux « source_id ».

Lookup Mapping

  • General

Dans cette partie, nous allons rediriger toutes les lignes qui ne correspondent pas vers la sortie « No match output ».
Ces lignes sont en fait de nouvelles lignes et seront donc insérées dans la table de destination.

Redirect rows to no match output

Etape 3 : Configuration du composant de Destination OLE DB Destination

  • Connection Manager

Insérez un composant « OLE DB Destination » et sélectionnez la table de destination.

Composant Destination - OLE DB Destination

  • Mappings

Liez les champs entre eux.

OLE DB Destination Mapping

Étape 4 : Configuration du composant de mise à jour OLE DB Command

  • Connection Managers

Comporant pour la mise a jour - OLE DB Command

  • Component Properties

Dans la partie « SqlCommand« , entrez la requête de mise à jour des données de la table destination.

Requete Tql Update

  • Column Mappings

Liez les champs de sortie du LookUp avec les paramètres de la requête de mise à jour.

Mapping des parametres de l'update

Exécution du lot

Execution du package

Lors de l’exécution de la requête nous voyons qu’il y a deux lignes ajoutées et deux lignes mises à jour.
Les id 1 et 2 existaient dans la table de destination et ont donc été redirigées vers le composant OLE DB Command,
tandis que les lignes 3 et 4 ont directement été redirigées vers le composant de destination comme étant de nouvelles lignes.

Résultat

Table de destination avant exécution

Table Destination

Après exécution

Résultat fin de traitement de upsert

4 réponses à “Mettre en place un Upsert avec un LookUp dans SSIS 2012

    • Sabrine MISSAOUI 3 novembre 2015 à 14 02 53 115311

      Bonjour,

      Je suis entrain d’utiliser SSIS afin de comparer deux id (num_client) appartenant à deux tables différentes(dim_clients et dim_ventes) et en cas d’égalité, j’aimerais remplir une colonne de la deuxième table (nom_client) à partir de la première. Puis-je avoir une proposition de la meilleure solution ? merci 🙂

  1. Sabrine MISSAOUI 3 novembre 2015 à 15 03 26 112611

    Bonjour,

    Je suis entrain d’utiliser SSIS afin de comparer deux id (num_client) appartenant à deux tables différentes(dim_clients et dim_ventes) et en cas d’égalité, j’aimerais remplir une colonne de la deuxième table (nom_client) à partir de la première. Puis-je avoir une proposition de la meilleure solution ? merci 🙂

    • fbrossard 7 novembre 2015 à 9 09 03 110311

      Bonjour,
      Utilisez une tâche SQL dans votre Control Flow afin d’executer un UPDATE du genre
      UPDATE dim_ventes
      SET nom_client = dim_clients.nom_client
      FROM dim_ventes INNER JOIN dim_clients ON dim_clients.num_client = dim_ventes.num_client

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :