我正在使用存储过程来获取实例的所有数据库的列表。
在存储过程中,我正在使用此代码。
SELECT dbid, name FROM master.dbo.sysdatabases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
它工作正常,但问题是我有一堆实例,所以我想将一个实例作为存储过程的参数,以便在特定实例上进行SELECT并从该实例获取所有数据库,但我没有知道怎么办!
非常感谢您的帮助!
答案 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'
这应该让您入门...