연결된 서버 목록을 반복하고 각 서버에 대해 특정 쿼리를 실행하는 작업을 설정하고 있습니다. TRY-CATCH 블록 내에서 쿼리를 실행하려고하므로 특정 서버에 문제가 있으면 로깅 할 수 있지만 다른 서버로 계속 진행할 수 있습니다.
루프 내에서 실행중인 쿼리는 다음과 같습니다.
BEGIN TRY
SELECT *
FROM OPENQUERY([server1], 'SELECT 1 AS c;');
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
서버에 연결하는 데 문제가 있으면 코드는 즉시 실패하고 CATCH
블록으로 전송되지 않습니다 . 서버가 연결되었지만 실제 쿼리에 오류 (예 : 0으로 나누기)가있는 경우 이는 CATCH
블록에서 예상 한대로 파악됩니다 .
예를 들어, 존재하지 않는 이름으로 연결된 서버를 만들었습니다. 위의 내용을 실행할 때 나는 다음을 얻습니다.
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"An error has occurred while establishing a connection to the server.
When connecting to SQL Server 2005, this failure may be caused by the
fact that under the default settings SQL Server does not allow remote
connections.".
Msg 53, Level 16, State 1, Line 0
Named Pipes Provider: Could not open a connection to SQL Server [53].
나는 BOL을 읽었 TRY-CATCH
으며 연결을 끊는 20 + 이상의 오류를 포착하지는 않지만 이것이 사실이 아니라고 생각합니다 (이것은 16 수준입니다).
왜 이러한 오류가 올바르게 잡히지 않는지 아십니까?