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 :

Conseil sur une PS qui doit interroger X bases


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 176
    Points : 91
    Points
    91
    Par défaut Conseil sur une PS qui doit interroger X bases
    Bonne rencontre

    Voici la situation, j’ai X bases de données de la même structure. Via une procédure stockée, j’aimerais interroger n’importe quelle base de données de mon choix.

    Pour le moment, j’ai fait ceci qui fonctionne mais je me demande si c’est la bonne solution et surtout s’il n’y a pas plus propre. C'est juste histoire de ne pas me faire frapper par un DBA s'il me croise dans la rue.

    J’ai crée une PS dans la master (ce n'est probablement pas propre... Dans mon cas, j'ai accès à la master mais dans une autre boite ça ne serait pas le cas) avec le code suivant :

    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
    18
    19
    20
    21
    22
    23
    USE [master]
    GO
    /****** Object:  StoredProcedure [dbo].[test]    Script Date: 07/07/2011 17:46:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[test] 
    	-- Add the parameters for the stored procedure here
    	@dbname varchar(30)
     
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	DECLARE @monSql char(100);
    	Set @monSql = 'SELECT * FROM ' + @dbname + '.dbo.Clients'
    	exec (@monSql)
     
        -- Insert statements for procedure here
     
    END
    D’avance, merci pour vos conseils.
    Raphaël.

  2. #2
    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,

    Est-ce que les bases de données sont hébergées par la même instance de SQL Server ?

    Vous pouvez éventuellement passer aussi le nom de la table, mais ce qui est gênant dans votre procédure c'est le "étoile".
    Mais c'est probablement pour l'exemple.

    Vous pouvez coder un peu plus défensivement, et utiliser sp_executesql :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ALTER PROCEDURE dbo.test
    	@dbname sysname
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF @dbname IS NULL
    	BEGIN
    		RAISERROR('A database name has to be passed', 16, 1)
    		RETURN
    	END
     
    	IF NOT EXISTS
    	(
    		SELECT	*
    		FROM	sys.databases
    		WHERE	name = @dbname
    		AND	state_desc <> 'ONLINE'
    	)
    	BEGIN
    		RAISERROR('The ''%s'' database does not exist or is not available', 16, 1)
    		RETURN
    	END
     
    	DECLARE @sql nvarchar(max)
    	SET	@sql = 'SELECT * FROM ' + @dbname + '.dbo.Clients'
    	EXEC	sp_executesql @sql
    END
    Une autre possibilité c'est de créer une procédure stockée, et de la marquer comme objet système.
    De cette façon vous pouvez l'appeler dans n'importe quel contexte de bases de données (voyez le billet que j'ai écrit à ce sujet).
    Vous êtes pour cela obligé de la créer dans la base de données master.

    Je pense qu'en parler avec votre DBA ne mange pas de pain

    @++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 176
    Points : 91
    Points
    91
    Par défaut
    Est-ce que les bases de données sont hébergées par la même instance de SQL Server ?
    Oui, tout à fait.

    Vous pouvez éventuellement passer aussi le nom de la table, mais ce qui est gênant dans votre procédure c'est le "étoile".
    Mais c'est probablement pour l'exemple.
    Oui, c'était simplement pour l'exemple et pour tester. En production, je n'utiliserai que quelques champs qui seront spécifiés.

    Merci pour le code, je vais adapter le mien pour qu'il soit plus robuste.

    Merci pour vos conseils et je vais lire votre billet qui me servira sans aucun doute dans un autre cas.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/03/2008, 16h58
  2. Conseil sur une configuration oracle RAC
    Par mrhuve dans le forum Oracle
    Réponses: 44
    Dernier message: 22/07/2005, 15h40
  3. Conseils sur une API simple pour Windows
    Par alejandro dans le forum Choisir un environnement de développement
    Réponses: 4
    Dernier message: 28/04/2005, 18h12
  4. Réponses: 14
    Dernier message: 14/03/2005, 09h16
  5. probléme de cadre sur une image qui me sert de lien
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/11/2004, 17h36

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