Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/05/2011, 10h14   #1
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
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 :
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;
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 10h31   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Une erreur éventuellement ....

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h16   #3
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
plusieurs erreurs.

Citation:
incorrect syntaxe near 'WHEN', excepting INSERT, UPDATE, DELETE
Citation:
the multi-part identified "P.id" could not be bound
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h31   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

un extrait de la doc de MERGE :
Citation:
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.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h45   #5
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Citation:
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 ?
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 12h01   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
ou les mise a jour n'on pas déjà étais faite
Code SQL :
1
2
3
4
5
 
UPDATE Cible
SET ...
FROM Source
WHERE [conditions]
puis :
Citation:
contrôler si la ligne n'a pas déjà étais inséré
sur le principe :
Code SQL :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 12h03   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
Bonjour,

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

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

Code :
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 :
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
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 15h06   #8
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Merci pour vos réponse.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h08.


 
 
 
 
Partenaires

Hébergement Web