Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 07/07/2011, 18h07   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 119
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2008
Messages : 119
Points : 35
Points : 35
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 :
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.
Raphael1980 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 13h19   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
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 669
Points : 8 729
Points : 8 729
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 :
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

@++
__________________
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 11/07/2011, 14h07   #3
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 119
Détails du profil
Informations personnelles :
Âge : 31

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

Citation:
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.
Raphael1980 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 03h59.


 
 
 
 
Partenaires

Hébergement Web