2009-01-28 102 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)