【问题标题】:How to test linkedserver's connectivity in TSQL如何在 SQL 中测试链接服务器的连接性
【发布时间】:2025-12-06 05:05:03
【问题描述】:

我需要编写一个程序来从多个远程服务器收集数据,

我使用链接服务器和 OPENQUERY 从服务器收集数据,但有时我会失去与某些服务器的连接,或者我根本无法连接它们(例如,远程服务器离线) - 在这些情况下,OPENQUERY 会导致超时。

所以我想先检查linkedservers的连接性,然后如果它成功运行查询,如果不是就转到下一个远程服务器。

我尝试将 OPENQUERY 放入 TRY - CATCH 但它仍然返回超时错误,sp_testlinkedserver 过程也返回超时错误。

非常感谢任何帮助。

【问题讨论】:

    标签: sql tsql connection linked-server openquery


    【解决方案1】:

    你可以使用下面的脚本

    https://web.archive.org/web/20190201090243/https://blogs.msdn.microsoft.com/sqltips/2005/06/07/test-linked-server-connection-settings/

    declare @srvr nvarchar(128), @retval int;
    set @srvr = 'my_linked_srvr';
    begin try
        exec @retval = sys.sp_testlinkedserver @srvr;
    end try
    begin catch
        set @retval = sign(@@error);
    end catch;
    if @retval <> 0
      raiserror('Unable to connect to server. This operation will be tried later!', 16, 2 );
    

    【讨论】:

    • 不过超时需要很长时间。无论链接服务器设置和“连接超时”服务器选项如何,我都在查看至少 40"。
    • 行为相同,此代码有效,但即使我在链接服务器属性上设置了 15 秒的连接超时,也需要 47 秒
    • 我们如何添加一个while循环来测试所有可用链接服务器的连接性,而不是一个变量?
    【解决方案2】:
    USE master;  
    GO  
    sp_testlinkedserver [LINKED_SERVER_NAME];  
    GO 
    

    SELECT * FROM OPENQUERY(LINKED_SERVER_NAME , 'select name DATABASE_NAME ,SYS_CONTEXT (''USERENV'', ''SESSION_USER'') USERNAME, host_name from v$database, dual, v$instance') ;
    

    【讨论】: