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

MS SQL Server Discussion :

Requetes multi-bases sur deux serveurs differents ?


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut Requetes multi-bases sur deux serveurs differents ?
    Bonjour,

    Je souhaiterai effectuer une requete qui interroge des tables situées sur deux bases differentes, elles memes implantées sur deux serveurs SQL distincts.

    Voici ma requete en local :

    SELECT COUNT(*) AS Expr1
    FROM CB_VAL INNER JOIN
    DA_ARCHIVE ON CB_VAL.numimage = DA_ARCHIVE.AID

    Actuellement cb_val est une copie de ma table CB située dans une autre base, sur un autre serveur.

    Comment puis je faire ?

    Merci par avance,

    a+

    Romain

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from serveur1.base1..table1
    inner join serveur2.base2..table2

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut
    Ca ne marche pas.
    Je precise que je suis en mssql server 2000 V8.0

    Peut etre est ce lié ?

    Merci,

    a+

    romain

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    L'utilisateur exécutant la requête a-t-il les droits de lecture sur tes deux bases de données ?
    De plus tu utilises un serveur lié. Je te conseillerai de vérifier que l'utilisateur défini sur le serveur lié soit le même que celui qui exécute la requête.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Par défaut
    Je commencerais par te demander si justement tu as déclaré correctement tes serveurs liés?

    Sur quelle base?

    Comment?

    Avec MS Studio 2005? Sql Enterprise 2000?...

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut
    Alors j'ai un groupe sql server dans lequel j'ai enregistré mes deux serveurs :
    -local, par defaut
    -le serveur distant

    En ce qui concerne les utilisateurs, sur les deux bases, j'ai déclaré un utilisateur dbo avec les droits identiques des deux cotés.

    merci,

    a+

    romain

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 964
    Billets dans le blog
    6
    Par défaut
    enregistrer un serveur dans votre console d'admin n'a rien à voir avec le fait de les faire dialoguer en SQL ensemble. Pour cela il faut les lier à l'aide des procédures sp_addlinkedserver et sp_addlinkedsrvlogin.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut serveur lié -> ok
    Bonjour,

    Effectivement entre temps j'ai reussi à lier mon serveur distant.
    Je suis en train d'essayer maintenant d'y appliquer mes requetes.

    Merci,

    a+

    romain

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut
    Je reussi à faire des requetes en tapant sur mes deux serveurs.

    A present je souhaiterai inserer des données de ma table1.base1.serveur1 dans une table2.base2.serveur2 en appliquant une condition.

    Pour cela j'utilise la commande insert into mais je n'arrive pas à appliquer ma condition.

    Voici la syntaxe de mon insertion :

    insert into table1
    select * from table1
    where (select * from serveur2.base2.dbo.table2 as t2, table1
    where table1.val1='B-01' and table1.val2=t2.val2)

    Merci par avance,

    a+

    romain

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Je pense que tu as écrit quelques choses en trop dans ta requête. Je pense que tu veux faire quelques choses comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO table1
    SELECT * FROM serveur2.base2.dbo.table2 AS t2
    WHERE  t2.val2 IN (SELECT table1.val2 FROM table1 WHERE table1.val1='B-01')

  11. #11
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut
    Effectivement, j'avais bien un truc en trop.
    mais à present, lorsque j'execute la commande j'ai un msg d'erreur au niveau de la commande insert.

    Ma commande exacte :

    INSERT INTO NECB
    SELECT *
    FROM valence.Damaris.dbo.CB t1 INNER JOIN
    DA_ARCHIVE ON t1.numimage = DA_ARCHIVE.AID
    WHERE (DA_ARCHIVE.NID = 'B-01')

    le message d'erreur obtenu :

    Serveur : Msg 213, Niveau 16, État 5, Ligne 1
    Erreur INSERT : le nom ou le numéro de colonne des valeurs fournies ne correspondent pas à la définition de la table.

    comme si il voulait un nom de colonne à la place de necb

    merci,

    a+

    romain

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Si tu as un un champ auto-incrémenté dans ta table NECB ou que tu n'as pas le même nombre de champs alors il te faut définir la liste des champs qui seront remplis et faire la correspondance avec les champ du select comme dans l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO NECB (ch1,ch2,ch3,....,chN)
    SELECT ch1,ch2,ch3,....,chN
    FROM valence.Damaris.dbo.CB t1 INNER JOIN
    DA_ARCHIVE ON t1.numimage = DA_ARCHIVE.AID
    WHERE (DA_ARCHIVE.NID = 'B-01')

  13. #13
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    Si tu dois faire des requêtes distantes sur des tables volumineuses, je te conseille d'utiliser la syntaxe OPENQUERY : ce sera bcp plus rapide. Tu peux l'utiliser dans des jointures.

  14. #14
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Par défaut
    Bonjour,

    Effectivement, apres avoir lancé la commande suivante, 4 heures apres ce n'est tjs pas terminé !

    INSERT into NECB (val1,val2,val3,val6,val7,val8,val9)
    SELECT t1.val1,t1.val2,t1.val3,t1.val4,t1.val5,t2.date2,t2.idx2
    FROM valence.Damaris.dbo.cb t1,valence.Damaris.dbo.da_archive t2,da_archive
    WHERE DA_ARCHIVE.NID = 'B-01' and t1.numimage=da_archive.aid

    Comment puis je integrer openquery a cette commande ?

    Merci,

    a+

    romain

  15. #15
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    La syntaxe openquery a la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM OPENQUERY
    (
       <nom du serveur lié ici>,
       '<requête ici>'
    )
    Le principe est de passer au serveur lié une requête qu'il exécutera en local. La requête est donc celle que tu exécuterais sur le serveur que tu veux attaquer, sans serveur lié dans le FROM.

    Pour les jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM OPENQUERY
    (
       <serveur lié ici>,
        'SELECT col  FROM tbl'
    ) as REMOTE_TBL
    INNER JOIN LOCAL_TBL On REMOTE_TBL.col = LOCAL_TBL.col
    Ici, l'intérêt de l'OPENQUERY n'est pas terrible, parce que tu ramènes du serveur lié toutes les données ('SELECT *') pour les trier ensuite en local, ce qui est l'inverse de ce pour quoi OPENQUERY existe. Il te faut donc passer des paramètres. Et là, ça se complique : tu ne peux pas concaténer la valeur d'un paramètre comme suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    declare @param varchar(1)
    set @param = 'A'
    SELECT *
    FROM OPENQUERY
    (
       <serveur lié ici>,
        'SELECT col  FROM tbl WHERE col = '' + @param + '''
    )
    Tu remarqueras qu'il y a un soucis de quotes ... Tu peux spécifier une valeur "en dur", mais pas une variable : il faut passer par une combinaison de OPENQUERY et de SP_EXECUTESQL.

    Essaie déjà comme ça pour te familiariser avec la syntaxe et tu verras ensuite pour les paramètres.

    A+

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/06/2012, 17h48
  2. Découper une base sur deux serveurs
    Par vaderetro33 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 29/10/2009, 11h16
  3. Requete d'ajout sur deux bases
    Par mcorvaisier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/02/2009, 16h17
  4. Réponses: 5
    Dernier message: 28/04/2008, 15h12
  5. Réponses: 7
    Dernier message: 16/03/2007, 15h53

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