一尘不染

测试链接服务器的连接并返回连接的链接服务器

sql

我想编写一个脚本来测试所有链接的服务器,并返回唯一已连接的服务器(可以肯定只有一个)。

这是我当前的脚本,但是我被困在这一点上:

DECLARE @retval INT
DECLARE @connected INT
DECLARE @name NVARCHAR(100)
DECLARE @getid CURSOR

SET @connected = 0

SET @getid = CURSOR FOR
SELECT name as Servers FROM sys.servers


OPEN @getid

FETCH NEXT FROM @getid INTO @name
WHILE @@FETCH_STATUS = 0

BEGIN
        EXEC @retval = sys.sp_testlinkedserver @name
        SELECT @name
        FETCH NEXT
        FROM @getid INTO @name

END

CLOSE @getid
DEALLOCATE @getid

但是使用此查询,代码无法在第一次迭代时停止,因为它无法连接到表的第一台服务器。这是错误消息:

链接服务器“ server1”的OLE DB提供程序“ MSDASQL”返回了消息“通信链接失败;
-10709连接失败(连接超时已过期)”。消息7303,级别16,状态1,过程sp_testlinkedserver,第1行无法为链接服务器“
server1”初始化OLE DB提供程序“ MSDASQL”的数据源对象。

任何想法,如何通过错误消息?


阅读 133

收藏
2021-03-08

共1个答案

一尘不染

更改了代码中的一些内容……试试吧。

  • IsOff仅表示连接失败。
  • 我添加了where子句以仅查看链接服务器
  • 我从未将游标视为变量,所以我删除了该游标以及其他不需要的变量
  • 使用了TRY / CATCH,因为sys.sp_testlinkedserver引发了异常,如果sys.sp_testlinkedserver不成功,则会引发异常。
  • 返回失败的原因
  • 将所有结果存储到表变量中,仅返回失败

DECLARE @name NVARCHAR(100)

declare @table table (IsOff int, ServerName varchar(100), TheError varchar(4000))


DECLARE getid CURSOR FOR
SELECT  name FROM sys.servers where is_linked = 1


OPEN getid

FETCH NEXT FROM getid INTO @name
WHILE @@FETCH_STATUS = 0

BEGIN

    begin try
        exec sys.sp_testlinkedserver @name
    end try

    begin catch
        insert into @table
        values
        (1,@name,ERROR_MESSAGE())
    end catch

FETCH NEXT FROM getid INTO @name

END

CLOSE getid
DEALLOCATE getid

select ServerName, TheError from @table where IsOff = 1
2021-03-08