2017-07-10 4 views
0

Ich versuche, Fehlermeldungen über alle meine verbundenen Server zu erhalten.EXEC sp_testlinkedserver über mehrere verbundene Server

Also ich habe drei Verbindungsserver:

  • IT_DATA
  • 193.0.1
  • Monitoring_Data

Ich weiß, dass Sie die folgende Abfrage ausführen werde ich die Informationen bekommen, die ich brauche zu einem verbundenen Server:

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

Aber ich versuche, eine Schleife zu erzeugen, die SP an alle meine Verbindungsserver exec:

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

Aber ich weiß nicht, wie kann ich eine Schleife zu erhalten, die Informationen aller Verbindungsserver erstellen, in ein Tisch.

Wer hat ein näheres Beispiel?

Danke!

Antwort

1

Ich mag keine Cursor verwenden, aber in diesem Fall ... Versuchen Sie folgendes:

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; 
+0

Sie meinen Tag retten !!! Vielen Dank!!! –

Verwandte Themen