Estoy configurando un trabajo para recorrer una lista de servidores vinculados y ejecutar una consulta específica para cada uno. Estoy tratando de ejecutar la consulta dentro de un bloque TRY-CATCH, así que si hay un problema con un servidor en particular, puedo iniciar sesión pero luego continuar con los otros servidores.
La consulta que estoy ejecutando dentro del bucle se ve así:
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!';
Si hay un problema al conectarse al servidor, el código simplemente falla inmediatamente y no se transfiere al CATCH
bloque. Si el servidor se conecta pero hay un error en la consulta real, por ejemplo, dividir por cero, entonces el CATCH
bloque lo detecta como se esperaba .
Por ejemplo, creé un servidor vinculado a un nombre que sé que no existe. Al ejecutar lo anterior solo obtengo:
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].
He leído BOL TRY-CATCH
y sé que no detectará errores de nivel 20+ que rompan la conexión, pero este no parece ser el caso (este es solo el nivel 16).
¿Alguien sabe por qué estos errores no se detectan correctamente?