我正在尝试通过所有链接服务器获取错误消息。
所以我有三个链接服务器:
我知道执行以下查询我将获得一个链接服务器所需的信息:
BEGIN TRY
EXEC sp_testlinkedserver N'193.0.1';
EXEC sp_executesql N'SELECT * FROM OPENQUERY([193.0.1], ''SELECT 1 AS c;'');';
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
但我正在尝试创建一个循环来执行SP到我的所有链接服务器:
DECLARE @Linked_Server varchar(50)
SET @Linked_Server = '193.0.1'
BEGIN TRY
EXEC sp_testlinkedserver N'193.0.1';
EXEC sp_executesql N'SELECT * FROM OPENQUERY([193.0.1], ''SELECT 1 AS c;'');';
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
但我不知道如何创建循环以将所有链接服务器的信息整合到一个表中。
有人有更近的例子吗?
谢谢!
答案 0 :(得分:1)
我不喜欢使用游标,但在这种情况下......试试这个:
create table dbo.LinkedServer (
LSName nvarchar(128)
, ErrorNumber int
, ErrorMessage nvarchar(4000)
);
DECLARE @Linked_Server nvarchar(128)
, @SQLString nvarchar(max);
declare crsLinkedServers cursor
for
select
s.name
from sys.servers s
where s.is_linked = 1;
open crsLinkedServers;
fetch next from crsLinkedServers
into @Linked_Server;
while @@fetch_status = 0
begin
BEGIN try
set @SQLString = N'SELECT * FROM OPENQUERY([' + @Linked_Server + '], ''SELECT 1 AS c;'');'
EXEC sp_testlinkedserver @Linked_Server;
EXEC sp_executesql @SQLString;
END TRY
BEGIN catch
insert into dbo.LinkedServer (LSName, ErrorNumber, ErrorMessage)
SELECT @Linked_Server, error_number(), error_message();
END CATCH;
fetch next from crsLinkedServers
into @Linked_Server;
end
close crsLinkedServers;
deallocate crsLinkedServers;
select
*
from dbo.LinkedServer;
drop table dbo.LinkedServer;