sp_testlinkedserver 输出详细

Kri*_*yer 2 sql-server linked-server

我已经构建了一个脚本/代理作业,每 10 分钟轮询一次我们的链接服务器,以确保它们在线。现在,当一个人离线时,它会生成一封电子邮件并通知我。见下文: 在此处输入图片说明

现在,现在它只使用通过/失败。我想要做的是,当服务器之间的通信离线时,不仅要生成它是离线的,还要生成原因。类似于您在测试链接服务器并且它处于离线状态时从 SSMS 获得的读数:

在此处输入图片说明

这可能吗?我已经搜索了任何可以帮助我完成此操作的其他详细参数,但找不到任何参数。信息是在 SSMS 中生成的,因此我相信有某种方法可以获取它,但我不确定如何获取。

像往常一样感谢伙计们!

更新 必须为此添加一些特定于系统的功能以及我已经构建但错误报告在线的我自己的 SQL。适用于我们的 SQL 服务器和 iSeries/400 环境。这是它现在吐出来的:

在此处输入图片说明

再次感谢您对这一问题的所有帮助。可能必须将其发布到 SSC,以便其他人可以使用它。

Aar*_*and 5

链接的答案一样,您应该可以使用TRY/CATCH; 另一个答案的问题(没有双关语)是,因为链接服务器的名称在编译时验证,如果测试失败,批处理不会执行。因此,您可以将链接服务器测试放在动态 SQL 中:

DECLARE @srv SYSNAME = N'linked_server_name';

BEGIN TRY
  EXEC master.sys.sp_executesql 
      N'EXEC master.sys.sp_testlinkedserver @srv;',
      N'@srv SYSNAME', @srv;
END TRY
BEGIN CATCH
  SELECT ERROR_NUMBER(), '|', ERROR_MESSAGE();
END CATCH
Run Code Online (Sandbox Code Playgroud)

这应该允许您捕获各种错误,包括:

  • 如果@srv未填充:

    第214话 过程需要类型为“sysname”的参数“@servername”。

  • 如果@srv不是定义的链接服务器:

    7202 | 在 sys.servers 中找不到服务器“whatever”。验证是否指定了正确的服务器名称。如有必要,请执行存储过程 sp_addlinkedserver 将服务器添加到 sys.servers。

  • 如果@srv在创建链接服务器时连接失败:

    7303 | 无法为链接服务器“whatever”初始化 OLE DB 访问接口“SQLNCLI11”的数据源对象。

  • 如果连接@srv1超时(例如服务器离线) - 这是使用本地链接服务器,因此使用命名管道或 TCP/IP 时文本可能会有所不同:

    2 | 共享内存提供程序:无法打开与 SQL Server [2] 的连接。

    (对于 TCP/IP,Kin 说错误消息是:

    TCP Provider:连接尝试失败,因为连接方在一段时间后没有正确响应,或者因为连接的主机没有响应而建立的连接失败。

  • 如果@srv未配置数据访问:

    7411 | 没有为数据访问配置服务器“whatever”。

  • 如果链接服务器配置了错误的用户名/密码(或通过了当前凭据但它们失败了):

    18456 | 用户 'foo' 登录失败。

EXECUTE AS如果您尝试在特定凭据下测试链接服务器,您也可以开始批处理。

如果链接服务器的测试成功,您可以继续在TRY块内执行其他操作,例如OPENQUERY使用 4 部分名称进行查询等,并且应该有大量其他错误可以捕获并详细报告。 ..