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

时间:2017-11-20 19:38:52

标签: sql sql-server

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

这是我目前的剧本,但我仍然坚持这一点:

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”的数据源对象。

任何想法,如何传递错误信息?

2 个答案:

答案 0 :(得分:1)

更改了代码中的一些内容......请试一试。

  • IsOff只是意味着连接失败。
  • 我添加了一个where子句来查看仅链接服务器
  • 我从来没有看过光标作为变量,所以我删除了那个以及我不需要的其他变量
  • 使用了TRY / CATCH,因为如果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

答案 1 :(得分:0)

以下是我的问题的最终代码:

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
        insert into @table
        values
        (1,@name,'Server is Connected')
    end try

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

FETCH NEXT FROM getid INTO @name

END

CLOSE getid
DEALLOCATE getid

select * from @table
where IsOff = 1