2009-01-28 5 views
0

J'ai une procédure stockée qui obtient tous les noms de base de données non-système à partir d'un serveur SQL:SQL Stored-Proc en utilisant le paramètre pour le nom du serveur?

select name from MySQLServer.master.sys.databases 
where name not like ('master') 
and name not like ('tempdb') 
and name not like ('msdb') 
and name not like ('model') 
and name not like ('Admin') 

Ce que je voudrais faire est de passer le nom du serveur en tant que paramètre, cette sproc est plus réutilisable:

@servername = 'some passed servername' 

select name from @servername.master.sys.databases 
where name not like ('master') 
and name not like ('tempdb') 
and name not like ('msdb') 
and name not like ('model') 
and name not like ('Admin') 

Cela peut-il être fait? Comment ferais-je cela?

ce que je pourrais créer une variable comme:

DECLARE @serverPointer nvarchar(MAX) 
SET @serverPointer = @servername + '.master.sys.databases' 

select name from @serverPointer 

Toute aide serait appréciée.

Répondre

2

Cela fonctionnera si vous avez lié des serveurs à tous les serveurs SQL que vous souhaitez interroger. En ce qui concerne la requête à utiliser, les bases de données système occupent les 4 premières valeurs ID_bdd. Ainsi, vous pouvez exécuter la commande suivante pour obtenir les bases de données de l'utilisateur:

SELECT '[' + name + ']' 
FROM sys.databases 
WHERE database_id > 4 

Putting qui, ensemble, vous feriez essentiellement les actions suivantes pour votre proc:

CREATE PROC GetUserDBs 
    @Server sysname 
AS 
BEGIN 
    DECLARE @SQL nvarchar(2000); 
    SET @SQL = 'SELECT ''['' + name + '']'' FROM [' + @Server + '].master.sys.databases WHERE database_id > 4'; 
    EXECUTE sp_executesql @SQL; 
END 
GO 
1
declare @servername nvarchar(max) 
DECLARE @serverPointer nvarchar(MAX) 
declare @qry nvarchar(max) 
@serverPointer = @servername + '.master.sys.databases' 
set @qry = 'select name from '[email protected] 
exec sp_executesql @qry 
0
Declare @query as varchar(1000) 

set @query = '' 
+ CHAR(10) + ' select name from '+ CAST(@servername AS VARCHAR(15))+'.master.sys.databases' 
+ CHAR(10) + 'where name not in (''master'',''tempdb'',''msdb'',''model'',''Admin'')' 

--print (@query) 
exec (@query) 
Questions connexes