Я налаштовую завдання, щоб переглядати список пов'язаних серверів та виконувати конкретний запит проти кожного з них. Я намагаюся виконати запит всередині блоку 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).
Хтось знає, чому ці помилки неправильно потрапляють?