我想编写一个脚本来测试所有链接的服务器并返回唯一连接的服务器(肯定只有一个)。
这是我当前的脚本,但我陷入了困境:
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
但是使用此查询,代码会在第一次迭代时停止,因为它无法连接到表的第一台服务器。 这是错误消息:
OLE DB provider "MSDASQL" for linked server "server1" returned message " Communication link failure;-10709 Connect failed (connect timeout expired)". Msg 7303, Level 16, State 1, Procedure sp_testlinkedserver, Line 1 Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "server1".
知道如何传递错误消息吗?
最佳答案
更改了代码中的一些内容...尝试一下。
- 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
关于sql - 测试链接服务器的连接并返回连接的链接服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47399782/