Ich richte einen Job ein, um eine Liste von Verbindungsservern zu durchlaufen und eine bestimmte Abfrage für jeden einzelnen auszuführen. Ich versuche, die Abfrage in einem TRY-CATCH-Block auszuführen. Wenn also ein Problem mit einem bestimmten Server vorliegt, kann ich es protokollieren und dann mit den anderen Servern fortfahren.
Die Abfrage, die ich in der Schleife ausführe, sieht ungefähr so aus:
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!';
Wenn beim Herstellen der Verbindung zum Server ein Problem auftritt, schlägt der Code sofort fehl und wird nicht in den CATCH
Block übertragen. Wenn der Server eine Verbindung herstellt, die Abfrage jedoch fehlerhaft ist, z. B. durch Null dividieren, wird dies vom CATCH
Block erwartet abgefangen .
Ich habe beispielsweise einen Verbindungsserver mit einem Namen erstellt, von dem ich weiß, dass er nicht existiert. Beim Ausführen des oben genannten bekomme ich nur:
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].
Ich habe BOL weiter gelesen TRY-CATCH
und weiß, dass es keine Fehler ab Stufe 20 abfängt, die die Verbindung unterbrechen, aber dies scheint nicht der Fall zu sein (dies ist nur Stufe 16).
Weiß jemand, warum diese Fehler nicht richtig abgefangen werden?