列出实例的所有数据库的存储过程

时间:2018-09-10 12:37:10

标签: sql sql-server tsql

我正在使用存储过程来获取实例的所有数据库的列表。

在存储过程中,我正在使用此代码。

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

它工作正常,但问题是我有一堆实例,所以我想将一个实例作为存储过程的参数,以便在特定实例上进行SELECT并从该实例获取所有数据库,但我没有知道怎么办!

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:-1)

尝试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不允许使用OPENROWSET和OPENDATASOURCE进行临时分布式查询。

要启用即席分布式查询,请执行以下操作:

sp_configure 'show advanced options', 1;  
RECONFIGURE;
GO 
sp_configure 'Ad Hoc Distributed Queries', 1;  
RECONFIGURE;  
GO  

答案 1 :(得分:-1)

在前面的回答中,我创建了一个游标查询,以遍历“ 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

答案 2 :(得分:-2)

我终于找到了可以正常工作的东西!这是代码:

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

感谢您的帮助!

答案 3 :(得分:-3)

您需要先添加一个参数...

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'

这应该让您入门...