Как я уже говорил, было бы гораздо проще использовать объект sys.servers
рядом с объектом sys.databases
. Вы можете использовать Динамический SQL для создания большого UNION ALL
запроса, чтобы сделать это:
USE master;
GO
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = STUFF((SELECT @CRLF +
N'UNION ALL' + @CRLF +
N'SELECT N' + QUOTENAME(s.[name],'''') + N' AS ServerName,' + @CRLF +
N' d.[name] AS DatabaseName,' + @CRLF +
N' d.[state] AS DatabaseState' + @CRLF +
N'FROM ' + CASE s.is_linked WHEN 1 THEN QUOTENAME(s.[name]) + N'.' ELSE '' END + N'master.sys.databases d'
FROM sys.servers s
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,13,'') + N';'
--PRINT @SQL; --Your Best Friend
EXEC sys.sp_executesql @SQL;
Это предполагает , что все связанные серверы доступны (если это не так, это другоепроблема, которую нужно исправить).
Я возвращаю значение state
, в котором используются следующие статусы ( sys.databases (Transact-SQL) ):
0 = ОНЛАЙН1 = ВОССТАНОВЛЕНИЕ2 = ВОССТАНОВЛЕНИЕ |SQL Server 2008 до SQL Server 20173 = RECOVERY_PENDING |SQL Server 2008 до SQL Server 20174 = ПОДДЕРЖКА5 = АВАРИЙНАЯ СИТУАЦИЯ |SQL Server 2008 до SQL Server 20176 = ОФФЛАЙН |SQL Server 2008 до SQL Server 20177 = КОПИРОВАНИЕ |Активная гео-репликация базы данных SQL Azure10 = OFFLINE_SECONDARY |Активная гео-репликация базы данных SQL Azure
Если вы хотите слово, используйте state_desc
.