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 :

Jointure table autre base, Nom base passé en Paramètre [2014]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut Jointure table autre base, Nom base passé en Paramètre
    Bonjour,

    J'ai plusieurs bases Sql Server 2014 sur le même serveur qui ont strictement la même structure.
    Je souhaite écrire 1 procStoc qui fait 1 jointure sur 2 tables contenues dans 2 bases différentes et dont le nom de la 2ème base est passé en paramètre. Ex.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ALTER PROCEDURE [dbo].[GetInfos]
    @BaseName varchar(8)
    AS BEGIN
     
    SELECT * 
    FROM    MaTable1 T1
                INNER JOIN @BaseName.dbo.MaTable2 T2 ON T2.xx = T1.yy
    ...
    La requête est ici simplifiée pour faciliter la compréhension. En réalité il y a de nombreuses autres jointures et clauses Where et le select n'est pas avec "*".
    J'ai trouvé des articles montrant comment saisir la requête ds un string puis l’exécuter avec EXEC ou EXECUTE sp_executesql mais je ne suis pas Fan de cette façon qui ne permet aucun contrôle de syntaxe.
    J'ai juste besoin de concaténer le nom de la base avec le nom de la table dynamiquement (@BaseName + ".dbo.MaTable2").
    Avez-vous 1 solution à me proposer ?

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous ne pouvez pas faire autrement que de passer par du SQL dynamique. Tout simplement parce qu'une variable c'est une valeur et un identifiant SQL (nom de base, de table, de colonne...) n'est pas une valeur !

    Cependant vous pouvez préalablement tester que le paramètre possède bien la valeur attendue.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE OR ALTER PROCEDURE [dbo].[GetInfos]
       @BaseName sysname
    AS 
    SET NOCOUNT ON;
    IF NOT EXISTS(SELECT *
                  FROM   sys.databases 
                  WHERE  name = @BaseName COLLATE French_BIN)
    BEGIN  
       THROW 66666, 'La base de données n''existe pas', 1;
       RETURN;
    END;
    DECLARE @SQL NVARCHAR(max)=  
    N'SELECT * 
    FROM    MaTable1 T1
                INNER JOIN '+ @BaseName + N'.dbo.MaTable2 T2 ON T2.xx = T1.yy;'
    EXEC (@SQL)
    GO
    A +

    Et pour apprendre SQL Server mon livre :

    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 440
Taille : 105,0 Ko
    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/ * * * * *

  3. #3
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    je me doutais qu'il n'y avait pas d'autre solution mais j'espérais un peu.
    Pas facile d’écrire 1 requête complexe de cette manière...MS si tu nous ecoutes...

    Merci pour ton aide.

  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
    Par défaut
    bonjour

    Quelle est la raison d'une telle conception ?

    en alternative, vous pouvez créer une vue qui fait l'union de la table pour toutes les BDD avec le nom de la BDD en colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE VIEW V_MaTable2
    AS 
    SELECT 'BDD1' AS BDD , *
    FROM BDD1.???.dbo.MaTable2 
    UNION ALL
    SELECT 'BDD2' AS BDD , *
    FROM BDD2.???.dbo.MaTable2 
    ...
    et ensuite faire donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT ...
    FROM V_MaTable2
    WHERE BDD = @BaseName
    ça évite le SQL dynamique, mais ce n'est pas pour autant une solution idéale...

  5. #5
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Par défaut
    Cette solution me convient parfaitement.
    La raison est 1 conception discutable de ces bases mais que je ne peux pas changer.
    Merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/11/2019, 19h46
  2. Procédure condition table autre base de données
    Par asurion dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/10/2016, 15h46
  3. Jointure entre 2 bases avec même nom de table et de colonne
    Par cedric.epardeau dans le forum MySQL
    Réponses: 14
    Dernier message: 03/09/2015, 14h10
  4. Réponses: 1
    Dernier message: 08/02/2011, 18h26
  5. longueur de tableau dont le nom est passé en paramètre
    Par max.onyx dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/06/2006, 19h54

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