Имена баз данных с нескольких серверов SQL - PullRequest
3 голосов
/ 14 марта 2012

Я застрял с запросом SQL. Как получить имена всех баз данных с нескольких серверов SQL одновременно? У меня есть IP сервера в таблице.

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Вы можете получить информацию о базе данных, используя.

SELECT * from sys.databases

Если вы хотите узнать это с других серверов, в чистом t-sql вам нужно связать сервер.

Дополнительная информация

Обновление после комментария

Вы говорите, что не можете связать серверы. Другой альтернативой является создание объекта .NET CLR. и вставлять их на сервер.

Чем вы можете подключаться к другим серверам, не связывая их вместе, и выполнять операторы sql.

Дополнительная информация

0 голосов
/ 14 марта 2012

Это дает все базы данных текущего сервера

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
...