2009-01-28 128 views
0

我有一个存储过程,会从一个SQL Server的所有非系统数据库的名称:SQL存储过程使用服务器名称的参数?

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') 

我想什么做的是通过服务器名作为参数,所以这个存储过程更具可重用性:

@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') 

可以这样做吗?我将如何做到这一点?

我能创建一个变量,如:

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

select name from @serverPointer 

任何帮助,将不胜感激。

回答

2

如果您已将服务器链接到希望查询的所有SQL Server,这将起作用。至于要使用的查询,系统数据库占用前4个database_id值。所以,你可以运行以下命令以获取用户数据库:

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

把它们一起,你会基本上做到为您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) 
相关问题