Sto impostando un lavoro per scorrere un elenco di server collegati ed eseguire una query specifica su ciascuno di essi. Sto cercando di eseguire la query all'interno di un blocco TRY-CATCH, quindi se si verifica un problema con un determinato server posso registrarlo ma continuare con gli altri server.
La query che sto eseguendo all'interno del ciclo è simile a questa:
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 si verifica un problema di connessione al server, il codice non riesce immediatamente e non viene trasferito al CATCH
blocco. Se il server si connette ma si verifica un errore nella query effettiva, ad esempio dividere per zero, questo viene rilevato come previsto dal CATCH
blocco.
Ad esempio, ho creato un server collegato con un nome che so non esiste. Quando eseguo quanto sopra ottengo solo:
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].
Ho letto BOL TRY-CATCH
e so che non colpirà gli errori di livello 20+ che interrompono la connessione, ma questo non sembra essere il caso (questo è solo il livello 16).
Qualcuno sa perché questi errori non vengono rilevati correttamente?