Estou configurando um trabalho para percorrer uma lista de servidores vinculados e executar uma consulta específica em cada um. Estou tentando executar a consulta dentro de um bloco TRY-CATCH, portanto, se houver um problema com um servidor específico, eu posso registrá-lo, mas depois continuar com os outros servidores.
A consulta que estou executando dentro do loop é mais ou menos assim:
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!';
Se houver um problema na conexão com o servidor, o código falhará imediatamente e não será transferido para o servidor. CATCH
bloco. Se o servidor se conectar, mas houver um erro na consulta real, por exemplo, dividir por zero, isso será capturado conforme o esperado pelo CATCH
bloco.
Por exemplo, criei um servidor vinculado a um nome que sei que não existe. Ao executar o acima, eu apenas recebo:
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].
Eu li BOL em TRY-CATCH
e sei que ele não detectará erros de nível 20+ que interrompem a conexão, mas isso não parece ser o caso (este é apenas o nível 16).
Alguém sabe por que esses erros não foram detectados corretamente?