我想编写一个脚本来测试所有链接的服务器并返回唯一连接的服务器(肯定只有一个)。
这是我目前的剧本,但我仍然坚持这一点:
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”的数据源对象。
任何想法,如何传递错误信息?
答案 0 :(得分: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
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