Sql server 如何处理来自多个服务器的查询,其中一些服务器可能处于非活动状态

Sql server 如何处理来自多个服务器的查询,其中一些服务器可能处于非活动状态,sql-server,timeout,Sql Server,Timeout,我有一个存储过程,它循环遍历服务器列表并查询它们的主数据库。当其中一台服务器停机时,存储过程查询超时。如何跳过对任何非活动服务器的查询,或者如何捕获服务器超时并继续对其余活动服务器进行查询?我确实有一个带有IsActive列的服务器表,但当服务器停机时,该值不会自动更改。当前,要查询的服务器列表基于表中的此IsActive列。另一个解决方案可能是找到一种方法,在服务器宕机时自动更改IsActive列,但我不知道该怎么做。有什么想法吗 编辑:我在SQL Server 2008中完成所有这些操作不要

我有一个存储过程,它循环遍历服务器列表并查询它们的主数据库。当其中一台服务器停机时,存储过程查询超时。如何跳过对任何非活动服务器的查询,或者如何捕获服务器超时并继续对其余活动服务器进行查询?我确实有一个带有IsActive列的服务器表,但当服务器停机时,该值不会自动更改。当前,要查询的服务器列表基于表中的此IsActive列。另一个解决方案可能是找到一种方法,在服务器宕机时自动更改IsActive列,但我不知道该怎么做。有什么想法吗

编辑:我在SQL Server 2008中完成所有这些操作

不要从引擎内部(链接服务器)执行此操作

来自外部进程的查询。使用集合并行启动查询。您的“查询”将一次获取所有信息,您只需等待所有停机的服务器一次,大致为您设置的超时,而不是等待每台停机的服务器一次。我建议不要对连接进行“测试”,因为尝试连接就是测试。比如说,如果您要在服务器上迭代并为每个服务器调用
sp_testlinkedserver
,那么最终您可能会等待更多的时间,因为测试仍然是序列化的,并且它们花费的时间与尝试连接的时间相同(这就是测试所做的,它尝试连接)


更好的解决方案是使用可靠的传输和异步消息传递,例如。由于programmign模型是异步的,但消息传递是可靠的,因此服务器是否停机并不重要,您稍后会得到想要的结果,当它最终重新联机时。

我建议使用sp_testlinkedserver作为后台进程,使IsActive列保持最新,在当前超时的实际存储过程中,不是每次迭代都要发布的内容。@Aaron:您在原始注释中遗漏了很多上下文。但即便如此,我还是建议不要使用“IsActive”专栏,因为它总是有偏离真实状态的风险(至少在两次更新之间),而且当专栏说是但网络说不是时,查询仍然必须处理这种情况。当然,但对于已经存在的体系结构,即使是一个热情可靠的状态使用,也比将批发业务转移到ServiceBroker更容易进行初始转换,这不会在一夜之间发生。谢谢您的评论@雷姆斯,我会把你的答案标记为正确的,因为这是个好主意。不幸的是,我的需求发生了变化,因此我只需要查询最外层存储过程中指定的服务器,而不需要查询所有活动的服务器。我正在处理的存储过程嵌套了几层,所以我想我需要将特定的服务器作为参数传递下去。如果有更好的方法,请告诉我。但是就原来的问题而言,你的答案很好,所以谢谢你。@WillWeld:向下传递参数是最好的选择。有很多方法可以将其传递到带外,比如#temp表或使用,但显式参数是正确的方法。