检查链接服务器数据库的状态

时间:2019-10-25 09:26:08

标签: sql-server

我想编写一个脚本来查询链接服务器上的所有数据库及其状态。“联机”或“脱机”。 在这里,您将必须使用变量和游标进行编程,并建立与链接服务器的连接,以便在那里读取视图。

结果应如下所示。

Server        DBName          Status
XYZ           ABC             Online
XFD           NDH             Offline 
etc...

1 个答案:

答案 0 :(得分:1)

正如我提到的,在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 2017
  3 = RECOVERY_PENDING | SQL Server 2008到SQL Server 2017
  4 =可疑
  5 =紧急情况| SQL Server 2008到SQL Server 2017
  6 =离线| SQL Server 2008到SQL Server 2017
  7 =复制| Azure SQL数据库活动的地理复制
  10 = OFFLINE_SECONDARY | Azure SQL数据库活动的地理复制

如果您想使用该单词,请使用state_desc