使用 SQL Server 2005 数据库和 SQL Server Management Studio 2008,我需要定期从 n 个链接数据库中的每个数据库中查询一个值。服务器在物理上是远程的,我基本上可以指望超时,尝试创建完成的查询失败。当服务器超时时,每次尝试都会失败,我特别得到了“登录超时过期”错误。
理想情况下,我需要一个存储过程,它为每个服务器生成一个包含一列或一行的行或表,以及一个指示我在远程数据库中的值的值,或者null
如果我得到一个超时(远程数据库上的值不能null
)。
我收集数据的第一个想法是
select
(SELECT TOP 1 [value]
FROM
[RemoteServer1].[DB].[dbo].[Table]) as
RemoteServer1,
(SELECT TOP 1 [value]
FROM
[RemoteServer2].[DB].[dbo].[Table]) as
RemoteServer2,
...
它会生成一行,其中包含我需要的所有值和可用于报告所需值的索引。但是一个 select 语句中的单个超时会杀死整个查询(如果到达所有服务器,它确实会正确执行)。我可以放心地假设在查询中的某个时间点,至少有一台服务器会超时。
我尝试了一个异常,但它似乎不起作用(我以前从未真正在 SQL Server 中使用异常)。我试过这个代替每个子查询:
begin try
(SELECT TOP 1 [Value]
FROM
[RemoteServer1].[DB].[dbo].[Table]) as RemoteServer1
end try
begin catch
select null as RemoteServer1
end catch,
但是超时仍然会导致整个查询失败,我认为这是因为只有在连接没有失败的情况下尝试才有效?
有什么方法可以工作吗?我能想到的唯一其他解决方案是每个远程数据库上的存储过程来发送这个记录,所以它都在我们的本地数据库上(我们可以依赖到达),但这会引入比这个查询更有价值的复杂性。
不久前我写了一些东西,也许这个链接会对你有所帮助。
http://www.mssqltips.com/sqlservertip/2017/script-to-check-all-your-linked-server-connections-for-sql-server/
我需要验证链接服务器是否正常工作,尤其是在服务器重建之后。在使用直接 t-sql 时,我遇到了同样的问题。所以我最终使用 Powershell 来完成工作。
高温高压
不幸的是,我无法获得纯 SQL 解决方案,因此我制作了一个命令行脚本来查询 PHP 中的每个数据库,因为 PHP 程序可以处理超时错误。
这些查询是针对 PHP 网站的,所以我认为该解决方案是可以接受的,因为与 Visual Basic 应用程序(其他内部建议的)和 Powershell 脚本(一个好主意,但需要最多设置)相比,它引入的复杂性最低一个这里用过一个)。