Хранимая процедура, которая перечисляет всю базу данных экземпляра - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю над хранимой процедурой, чтобы получить список всех баз данных экземпляра.

Из хранимой процедуры я использую этот код.

SELECT dbid, name FROM master.dbo.sysdatabases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')

Работает нормально, но дело в том, что у меня есть несколько экземпляров, поэтому я хочу поместить экземпляр в качестве параметра моей хранимой процедуры для SELECT в конкретном экземпляре и получить все БД из этого экземпляра, но я не Знаете, как это сделать!

Большое спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Расширяя свой предыдущий ответ, я создал запрос курсора для циклического перебора «других» таблиц из запроса «master.dbo.sysdatabases».

Это должно быть лучшим началом, чтобы помочь вам построить вашу хранимую процедуру ...

DECLARE @TableName AS VARCHAR(250);
DECLARE @SQL AS VARCHAR(500);
DECLARE @FindTable as CURSOR;

SET @FindTable = CURSOR FOR

SELECT name FROM master.dbo.sysdatabases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')

OPEN @FindTable

FETCH NEXT FROM @FindTable INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN

SET @SQL = 'SELECT  * FROM ' + @TableName + '.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'''


EXEC(@SQL)

FETCH NEXT FROM @FindTable INTO @TableName;
END

CLOSE @FindTable
0 голосов
/ 10 сентября 2018

Попробуйте OPENROWSET - с аутентификацией Windows

DECLARE @server VARCHAR(255);
SET @server='your_sql_server_name';

DECLARE @remotequery VARCHAR(MAX);
SET @remotequery='
SELECT *
FROM
    OPENROWSET(''SQLOLEDB'',
               ''Server='+@server+';Trusted_Connection=yes;'',
               ''SELECT dbid , name FROM   master.dbo.sysdatabases
 WHERE  name NOT IN ( ''''master'''', ''''tempdb'''',''''model'''', ''''msdb'''')'')';
EXEC(@remotequery);

OPENROWSET с пользователем и паролем

DECLARE @server VARCHAR(MAX);
DECLARE @user VARCHAR(255)
DECLARE @password VARCHAR(255)

SET @server='your_sql_server_name';
SET @user = 'your_user';
SET @password = 'your_password'

DECLARE @remotequery VARCHAR(MAX);

SET @remotequery='
SELECT *
FROM
    OPENROWSET(''SQLOLEDB'',
               ''Server='+@server+';UID='+@user+';PWD=' + @password + ';'',
               ''SELECT dbid , name FROM   master.dbo.sysdatabases
 WHERE  name NOT IN ( ''''master'''', ''''tempdb'''',''''model'''', ''''msdb'''')'')';
EXEC(@remotequery);

По умолчанию SQL Server не разрешает распределенные запросы ad hoc с использованием OPENROWSET и OPENDATASOURCE.

Чтобы включить специальные распределенные запросы:

sp_configure 'show advanced options', 1;  
RECONFIGURE;
GO 
sp_configure 'Ad Hoc Distributed Queries', 1;  
RECONFIGURE;  
GO  
0 голосов
/ 10 сентября 2018

я наконец-то нашел что-то, что отлично работает!Вот код:

CREATE PROC GetUserDBs
@Server sysname
AS
BEGIN
    DECLARE @SQL nvarchar(2000);
    SET @SQL = 'SELECT name FROM [' + @Server + '].master.sys.databases WHERE WHERE name NOT IN (''master'', ''tempdb'', ''model'', ''msdb'')';
    EXECUTE sp_executesql @SQL;
END
GO

Спасибо за помощь!

0 голосов
/ 10 сентября 2018

Вам нужно начать с добавления параметра ...

CREATE PROCEDURE dbo.uspGetDBName @Name nvarchar(30)
AS
SELECT dbid, name FROM master.dbo.sysdatabases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
AND Name = @Name
GO

Вы вызываете это, используя следующую строку.

EXEC dbo.uspGetDBName @Name = 'Movies'

Это должно помочь вам начать ...

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