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
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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 éprouvé
    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
    Points : 923
    Points
    923
    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
    Errare humanum est, perseverare diabolicum (Sénèque)

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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 averti
    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
    Points : 406
    Points
    406
    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.
    Bon courage pour la suite.

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 480
    Points : 357
    Points
    357
    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?...
    Arrêtez de poster des liens! Expliquez! (ça évite les erreur HTTP 404)

    L'homme est plus fort que la machine... ne renoncez jamais


  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    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
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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 averti
    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
    Points : 406
    Points
    406
    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')
    Bon courage pour la suite.

  11. #11
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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 averti
    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
    Points : 406
    Points
    406
    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')
    Bon courage pour la suite.

  13. #13
    Membre du Club
    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
    Points : 58
    Points
    58
    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
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 5
    Points
    5
    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 du Club
    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
    Points : 58
    Points
    58
    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, 16h48
  2. Découper une base sur deux serveurs
    Par vaderetro33 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 29/10/2009, 10h16
  3. Requete d'ajout sur deux bases
    Par mcorvaisier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/02/2009, 15h17
  4. Réponses: 5
    Dernier message: 28/04/2008, 14h12
  5. Réponses: 7
    Dernier message: 16/03/2007, 14h53

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