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

Développement SQL Server Discussion :

Merge mise à jour


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut Merge mise à jour
    Bonjour

    J'essaye de faire un merge entre deux base de données sur deux serveurs different.
    Mais ceci ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MERGE OPENQUERY("MON-SERVEUR",'SELECT * FROM MA_BASE.dbo.PERSONNE')  AS P using sugarcrm_db.dbo.contacts AS Co
    on (P.id=Co.id)
    WHEN MATCHED THEN
    		UPDATE SET first_name = P.NOM	
    WHEN NOT MATCHED by TARGET THEN
    		INSERT .......
    WHEN NOT MATCHED By SOURCE THEN
    Delete;

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Une erreur éventuellement ....

    ++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    plusieurs erreurs.

    incorrect syntaxe near 'WHEN', excepting INSERT, UPDATE, DELETE
    the multi-part identified "P.id" could not be bound

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    un extrait de la doc de MERGE :
    target_table

    Table ou vue à laquelle les lignes de données de <table_source> sont comparées sur la base de <clause_search_condition>. target_table est la cible de toute opération de type INSERT, UPDATE ou DELETE spécifiée par les clauses WHEN de l'instruction MERGE.

    Si target_table est une vue, toutes les opérations dont elle fait l'objet doivent satisfaire aux conditions requises pour la mise à jour des vues. Pour plus d'informations, consultez Modification de données par l'intermédiaire d'une vue.

    target_table ne peut pas être une table distante. Aucune règle ne peut être définie sur target_table.
    Je pense que vous allez etre obligé de passer par une série de UPDATE/INSERT pour faire votre MERGE, ou, si vous le pouvez, exécuter le MERGE sur le serveur distant, avec OPENQUERY comme table source et non comme table cible.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    Je pense que vous allez etre obligé de passer par une série de UPDATE/INSERT pour faire votre MERGE
    Je vois pas trop la.
    Enfaite je veux contrôler si la ligne n'a pas déjà étais inséré, ou les mise a jour n'on pas déjà étais faite.
    Comment je pourrais faire autrement que par une commande merge ?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ou les mise a jour n'on pas déjà étais faite
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE Cible
    SET ...
    FROM Source
    WHERE [conditions]
    puis :
    contrôler si la ligne n'a pas déjà étais inséré
    sur le principe :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO Cible
    SELECT MesColonnes
    FROM Source
    WHERE NOT EXIST (
        SELECT *
        FROM Cible
        WHERE [condition]
    )


    EDIT : quand je disais "une serie d'UPDATE/INSERT", il fallait en effet comprendre un UPDATE, puis un INSERT

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    En revanche un MERGE sur monServeurLie.maBase.monSchema.maTable fonctionne ...

    Pour être un peu plus précis sur les requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE		Cible
    SET		mesColonnes = S.mesColonnes
    FROM		Source AS S
    INNER JOIN	Cible AS C ON S.PK = C.PK
    Pour l'INSERT je serai plus fan d'une LEFT JOIN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT		INTO Cible
    SELECT		MesColonnes
    FROM		Source AS S
    LEFT JOIN	Cible AS C ON S.PK = C.PK
    WHERE		C.PK IS NULL
    @++

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    Merci pour vos réponse.

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

Discussions similaires

  1. Mise à jour clé primaire merge()?
    Par Razielback dans le forum Persistance des données
    Réponses: 6
    Dernier message: 25/06/2010, 11h21
  2. Problème de mise à jour avec utilisation de merge
    Par methodman225 dans le forum JPA
    Réponses: 1
    Dernier message: 01/06/2010, 11h26
  3. Réponses: 1
    Dernier message: 17/02/2010, 07h34
  4. mise à jour de champs time (interbase)
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 04/03/2003, 10h25
  5. Réponses: 2
    Dernier message: 12/02/2003, 15h26

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