SQL Stored-Proc, используя параметр для имени сервера? - PullRequest
0 голосов
/ 28 января 2009

У меня есть хранимая процедура, которая получает все имена не системных баз данных от SQL Server:

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

То, что я хотел бы сделать, это передать имя сервера в качестве параметра, так что этот sproc можно использовать повторно:

@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

Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 28 января 2009

Это будет работать, если вы связали серверы со всеми серверами SQL, которые вы хотите запросить. Что касается используемого запроса, системные базы данных принимают первые 4 значения database_id. Таким образом, вы можете запустить следующее для получения пользовательских баз данных:

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

Сложив это вместе, вы в основном сделаете следующее для вашего процесса:

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 голос
/ 28 января 2009
declare @servername nvarchar(max)
DECLARE @serverPointer nvarchar(MAX)
declare @qry nvarchar(max) 
@serverPointer = @servername + '.master.sys.databases' 
set @qry = 'select name from '+@serverPointer
exec sp_executesql @qry
0 голосов
/ 28 января 2009
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)
0 голосов
/ 28 января 2009

Для этого вам нужно создать динамический запрос в хранимой процедуре и выполнить его с помощью команды exec, вот пара примеров:

http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1

http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...