IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SSIS Discussion :

SSIS faire un UPDATE


Sujet :

SSIS

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut SSIS faire un UPDATE
    Bonjour.
    Je souhaiterai avec SSIS faire un UPDATE.
    J'ai une table source sur un serveur S et une table destination identique sur un serveur D.
    Elles ont des id (id_histo) uniques et identiques.
    Je souhaite mettre à jour la table qui est sur le serveur destination pour chaque id_histo en remplaçant les valeurs des colonnes firstname et lastname.


    Je crée mes 2 OLE DB source et destination et au milieu je tente de mettre un lookup.
    Dans OLE DB source, j'ai sélectionné 3 colonnes, l'id et les 2 colonnes à updater.
    Aprés je ne sais comment faire sur mon onglet columns, j'obtiens :

    Nom : SSISLookup.PNG
Affichages : 1958
Taille : 70,6 Ko

    Merci de votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Bonjour Pierre,

    Alors moi je vais te proposer une autre solution pour faire ton update, c'est d'utiliser dans ton flux de contrôle une transfo d'éxecution de requête SQL et d'y mettre dedans ta requête update.
    C'est plus simple et plus performant.

    Si ça ne corresponds pas à ce que tu veux, je pense qu'il faut plus d'informations pour mieux cerner ton besoin.

    Cdt.

    Slaveak

    EDIT : Ah non ils sont sur des serveurs différents : Alors ce que tu fais c'est que dans ton flux de données tu utilises comme destination une commande OLE DB avec ta requête update dans laquelle tu mets en paramètre les deux colonnes qui vont venir updater et ta colonne id dans le where.
    Comme ça tu updateras ligne à ligne dans ton deuxième serveur

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    OUI, c'est vrai merci.

    Mais comment on fait pour identifier les noms des 2 bases :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE ServeurCible.BDD.MaTable td
    SET td.firstname = (SELECT ts.firstname FROM ServeurSource.BDD.MaTable ts WHERE td.id_histo = ts.id_histo)
    SET td.lastname= (SELECT ts.lastnameFROM ServeurSource.BDD.MaTable ts  WHERE td.id_histo = ts.id_histo)

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Justement Pierre, d’où mon edit.

    - Dans ta source (composant Source OLEDB), tu ramènes les trois colonnes qu'il te faut pour updater ta table de destinations, tu as donc un connecteur sur ton serveur S
    - Dans ta destination qui sera le composant commande OLE DB tu as un autre connecteur (donc celui de ton serveur D) et tu met ta requête d'update dedans dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE BDD.MaTable td
    SET td.firstname = ?
    SET td.lastname= ?
      WHERE td.id_histo = ?
    Et dans la commande OLE DB tu lies tes trois "?" aux colonnes que tu as ramené te ta source. Et le tour est joué !

    bon c'est moins performant qu'un update dans un même serveur, mais c'est un bon moyen de le faire d'un serveur à un autre assez simplement.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    J'ai que 2 composants OLE DB ?
    Dans le OLE DB destination, je n'arrive pas à faire le mapping :
    Nom : Capture.PNG
Affichages : 1767
Taille : 49,9 Ko

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Non non je ne parle pas de Destination OLE DB mais bien d'un autre composant qui s'appelle (vu que tu as la version anglaise) OLE DB Command Transformation disponible dans les data flow (cf. le lien que j'ai mis dans mon post précédent).

    Et oui à la fin tu as une Source OLE DB et une Commande Transformation OLEDB

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    J'en transpire :
    [OLE DB Command [807]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E14.
    An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80040E14 Description: "Impossible de préparer les instructions.".
    An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80040E14 Description: "La variable scalaire "@first" doit être déclarée.".
    J'ai changer les noms des colonnes externes dans entrées de la commande...

    Nom : Capture.PNG
Affichages : 1698
Taille : 52,2 Ko

  8. #8
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    1. Donc là dans ce composant tu mets ta requête dans Componant properties > Sql Command
    2. Dans Column mapping tu mets chacune de tes colonnes en entrée sur chaque paramètres et dans l'ordre de tes points "?"

    Et non tu n'as pas besoin de changer tes nom de colonnes (enfin normalement)

    Bien sûr dans Connexion Manager, tu mets ton connecteur à ton serveur D

    Voila !

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Bonjour.
    C'est bien ce que j'ai fait mais j'ai toujours cette erreur
    [OLE DB Command [807]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E14.
    An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80040E14 Description: "Impossible de préparer les instructions.".
    An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80040E14 Description: "La variable scalaire "@first" doit être déclarée.".

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je n'ai pas tout lu (honte à moi ) mais voici ce que je ferais dans ton cas :
    - Une source OLEDB faisant la sélection sur ton serveur S : SELECT id_histo, lastname, firstname FROM S
    - Suivi d'un lookup, dans lequel tu paramètres la sélection de ton serveur D : SELECT id_histo, lastname, firstname FROM D
    Tu paramètres ton lookup en liant les id_histo
    Et tu mets en sortie les lastname et firstname de ton seveur D (met un alias de sortie : id_histo_d, lastname_d et firstname_d pour les reconnaitre)
    - Suivi d'un fractionnement conditionnel. Tu crées une sortie avec la condition suivante : ( (lastname != lastname_d) || (firstname != firstname_d) )
    Cette sortie contiendra toutes tes lignes qui ont le même id_histo des 2 cotés mais avec soit un lastname différent, soit un firstname différent
    - Suivi d'un composant OLEDB COMMAND, relié à la sortie "Sortie de recherche avec correspondances"
    Premier onglet : Connexion serveur D
    Deuxieme onglet : Dans la sqlcommand : UPDATE firstname = ?, lastname=? WHERE id_histo = ?
    Troisieme onglet : Tu mets firstname dans Param_0, lastname dans Param_1 et id_histo_d dans Param_2

    Et voila

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2014
    Messages : 744
    Points : 336
    Points
    336
    Par défaut
    Bonjour.
    Merci de ton aide.

    Je repars avec un Lookup.

    Tu paramètres ton lookup en liant les id_histo
    Comme ça : Nom : Capture.PNG
Affichages : 1720
Taille : 29,7 Ko

    Je ne sais pas faire cette partie dans le Lookup :
    Et tu mets en sortie les lastname et firstname de ton seveur D (met un alias de sortie : id_histo_d, lastname_d et firstname_d pour les reconnaitre)
    - Suivi d'un fractionnement conditionnel. Tu crées une sortie avec la condition suivante : ( (lastname != lastname_d) || (firstname != firstname_d) )

  12. #12
    Membre éprouvé
    Avatar de Elros
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2009
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 403
    Points : 912
    Points
    912
    Billets dans le blog
    9
    Par défaut
    Hello,

    Tu dois relier ton id_histo (available input) avec id_histo (available lookup). En faisant ça, tu créés ta jointure.

    Elros
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton

    Venez faire un petit tour sur mon blog : Elros - Bienvenue dans le monde de la Business Intelligence

  13. #13
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par thibault974 Voir le message
    Bonjour,

    Je n'ai pas tout lu (honte à moi ) mais voici ce que je ferais dans ton cas :
    - Une source OLEDB faisant la sélection sur ton serveur S : SELECT id_histo, lastname, firstname FROM S
    - Suivi d'un lookup, dans lequel tu paramètres la sélection de ton serveur D : SELECT id_histo, lastname, firstname FROM D
    Tu paramètres ton lookup en liant les id_histo
    Et tu mets en sortie les lastname et firstname de ton seveur D (met un alias de sortie : id_histo_d, lastname_d et firstname_d pour les reconnaitre)
    - Suivi d'un fractionnement conditionnel. Tu crées une sortie avec la condition suivante : ( (lastname != lastname_d) || (firstname != firstname_d) )
    Cette sortie contiendra toutes tes lignes qui ont le même id_histo des 2 cotés mais avec soit un lastname différent, soit un firstname différent
    - Suivi d'un composant OLEDB COMMAND, relié à la sortie "Sortie de recherche avec correspondances"
    Premier onglet : Connexion serveur D
    Deuxieme onglet : Dans la sqlcommand : UPDATE firstname = ?, lastname=? WHERE id_histo = ?
    Troisieme onglet : Tu mets firstname dans Param_0, lastname dans Param_1 et id_histo_d dans Param_2

    Et voila
    Ah ben pareil que moi, à une exception, prêt, moi j'update quoi qu'il arrive, pas de lookup pour voir si c'est la peine d'update. mais la suite c'est la même

    @ Pierre, là tu as tout pour y arriver !

  14. #14
    Invité
    Invité(e)
    Par défaut
    Dans le lookup, relie les id (glisser deposer), et coche l'ensemble des colonnes à droite.
    En bas tu les renomme dans la partie "Alias".

    Le Fractinnement Conditionnel, c'est un composant SSIS. Tu double clique dessus, et tu définie une ligne avec la condition que je t'ai donnée.

    Difficile de t'aider plus que ca

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SSIS][2k5] Comment faire un UPDATE ?
    Par Antoun dans le forum SSIS
    Réponses: 14
    Dernier message: 14/05/2010, 16h40
  2. [SSIS] [2K5] OLE DB Command pour faire un update Oracle
    Par clementratel dans le forum SSIS
    Réponses: 2
    Dernier message: 17/02/2009, 15h52
  3. [Debutant] faire un update sur tout une table
    Par Karibou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 14h44
  4. [ SQL ] Faire un update avec un select imbriqué
    Par zozolh2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2005, 12h05
  5. faire un update partiel
    Par danseur dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 19/01/2004, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo