我想编写一个脚本来查询链接服务器上的所有数据库及其状态。“联机”或“脱机”。 在这里,您将必须使用变量和游标进行编程,并建立与链接服务器的连接,以便在那里读取视图。
结果应如下所示。
Server DBName Status
XYZ ABC Online
XFD NDH Offline
etc...
答案 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
。