来自多个SQL Server的数据库名称

时间:2012-03-14 09:04:23

标签: sql sql-server-2008 sql-server-2005

我遇到了SQL查询。如何一次从多个SQL Server获取所有数据库名称?我在桌子上有服务器IP。

2 个答案:

答案 0 :(得分:4)

您可以使用。

获取数据库信息
SELECT * from sys.databases

如果你想从其他服务器知道这个,在纯t-sql中,你需要链接服务器。

更多信息

评论后更新

你说你无法链接服务器。另一种方法是创建.NET CLR对象 并将它们嵌入服务器。

您可以连接到其他服务器,而无需将它们链接在一起,并执行sql语句。

更多信息

答案 1 :(得分:0)

这提供了当前服务器的所有数据库

EXEC sp_databases

如果你知道其他服务器ips,你可以使用 sp_addlinkedserver 链接它们并获得所需的结果。

编辑:以下是您的完整答案,如上所述但使用sys.databases

DECLARE @T AS TABLE (dbName VARCHAR(250),ipAddress VARCHAR(20))
DECLARE @SERVERS AS TABLE (Id INT IDENTITY(1,1),serverIp VARCHAR(20),
                           rmUser VARCHAR(20),rmPassword VARCHAR(20))
DECLARE @ipAdd AS VARCHAR(20),@user AS VARCHAR(20), @pw AS VARCHAR(20),@rowCount AS INT

SELECT @rowCount = 1

--ADD THE LIST OF SERVERS WITH LOGIN USER NAME AND PASSWORDS HERE
INSERT INTO @SERVERS (serverIp,rmUser,rmPassword) 
    VALUES ('serverIp1','rmuser1','rmpassword1'), ('serverIp2','rmuser2','rmpassword2')

WHILE EXISTS(SELECT Id FROM @SERVERS WHERE Id = @rowCount)
BEGIN
SELECT @ipAdd = serverIp, @user= rmUser, @pw = rmPassword 
    FROM @SERVERS WHERE Id =  @rowCount

    --Link the server and add login
EXEC sp_addlinkedserver @ipAdd,N'SQL Server';
EXEC sp_addlinkedsrvlogin @rmtsrvname=@ipAdd, 
                          @useself='false',
                          @rmtuser=@user,
                          @rmtpassword=@pw

     --INSERT results into a temp view and then into @T
 EXEC('CREATE VIEW vTemp AS SELECT name FROM ['+@ipAdd+'].master.sys.databases')
 INSERT INTO @T  SELECT name,@ipAdd FROM vTemp

     --Drop view
 DROP VIEW vTemp

     --Drop login and link to the remort server
 EXEC sp_droplinkedsrvlogin @ipAdd, NULL
 EXEC sp_dropserver @ipAdd, NULL;

     SELECT @rowCount = @rowCount +1

END

--FINALLY YOUR RESULTS
SELECT * FROM @T