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

问题描述 投票:2回答:2

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

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

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

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

sql sql-server
2个回答
1
投票

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

  • IsOff只是意味着连接失败。
  • 我添加了一个where子句来查看Linked Servers
  • 我从未将光标视为变量,所以我删除了它以及其他我不需要的变量
  • 使用了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

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
© www.soinside.com 2019 - 2024. All rights reserved.