SQL存储过程使用服务器名称的参数?
问题描述:
我有一个存储过程,会从一个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
任何帮助,将不胜感激。
答
如果您已将服务器链接到希望查询的所有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
答
要做到这一点,你需要在存储过程中创建一个动态查询,并使用exec命令执行它,这里有几个例子:
http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1
http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-2
答
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
答
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)