多个链接服务器上的EXEC sp_testlinkedserver

时间:2017-07-10 13:05:29

标签: sql sql-server tsql logging linked-server

我正在尝试通过所有链接服务器获取错误消息。

所以我有三个链接服务器:

  • IT_DATA
  • 193.0.1
  • Monitoring_Data

我知道执行以下查询我将获得一个链接服务器所需的信息:

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!';

但我不知道如何创建循环以将所有链接服务器的信息整合到一个表中。

有人有更近的例子吗?

谢谢!

1 个答案:

答案 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;