我想编写一个脚本来测试所有链接的服务器,并返回唯一一个连接的服务器(肯定只有一个)。
这是我当前的脚本,但我被困在那一点:
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”的数据源对象。
任何想法,如何通过错误信息?
更改了代码中的一些内容......请试一试。
.
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
这是我的问题的最终代码:
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