Я настраиваю задание на просмотр списка связанных серверов и выполнение определенного запроса для каждого из них. Я пытаюсь выполнить запрос внутри блока 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блок. Если сервер подключается, но в текущем запросе есть ошибка, например, деление на ноль, то это перехватывается, как ожидается 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).
Кто-нибудь знает, почему эти ошибки не улавливаются правильно?