我想编写一个脚本来测试所有链接的服务器并返回唯一连接的服务器(肯定只有一个)。
这是我当前的脚本,但我陷入了困境:
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”的数据源对象。
知道如何传递错误消息吗?
更改了代码中的一些内容...尝试一下。
- 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)