SQL server TRY … CATCH fängt keinen Fehler ein

BEGIN TRY EXEC N'EXEC sp_testlinkedserver N''[MyLinkedserver]'';'; END TRY BEGIN CATCH SELECT 'LinkedserverDown' AS Result RETURN END CATCH SELECT TOP(1) FirstName FROM [MyLinkedserver].TestDatabase.dbo.Customer 

Meine erste Erfahrung mit der Verwendung eines TRY … CATCH in SQL server hat mich noch nicht beeindruckt.

Ich habe den SQL-Dienst auf meinem verknüpften server gestoppt, um zu versuchen, eine Situation zu testing, in der unser verknüpfter server heruntergekommen ist, unzugänglich usw.

Anstatt irgendwelche Fehler zu fangen, schlägt dieser Code einfach das "Anmeldungszeitlimit abgelaufen" und "netzwerkbezogener oder instanzspezifischer Fehler ist aufgetreten …" Fehler und hört auf, den Rest des Codes zu beenden.

Ist mein SQL TRY … CATCH Block nicht richtig eingerichtet?

Wie pro MSDN, was sp_testlinkedserver tun ist

Testet die Verbindung zu einem verknüpften server. Wenn der Test nicht erfolgreich ist, wirft die Prozedur eine exception mit dem Grund des Fehlers auf.

Wenn Sie also Ihren Code (SP) sp_testlinkedserver prüft der sp_testlinkedserver auf die Verbindung. Aber du kannst das verschieben und mit dynamischem SQL erfassen.

So was –

 BEGIN TRY EXEC sp_executesql N'EXEC sp_testlinkedserver [192.168.51.81];'; END TRY BEGIN CATCH SELECT 'LinkedserverDown' AS Result END CATCH 

Von MSDN

Fehler unbeeinflusst von einem VERSUCHEN … CATCH Construct

VERSUCHEN … CATCH-Konstrukte fangen nicht die folgenden Bedingungen ein:

  1. Warnungen oder Informationsmeldungen mit einer Schwere von 10 oder weniger.
  2. Fehler, die eine Schwere von 20 oder höher haben, die die SQL server Database Engine-Taskverarbeitung für die session beenden. Wenn ein Fehler auftritt, der eine Schwere von 20 oder höher hat und die databaseverbindung nicht unterbrochen wird, wird TRY … CATCH den Fehler beheben.
  3. Aufmerksamkeiten, wie z. B. Client-Interrupt-Anfragen oder defekte Client-Verbindungen.
  4. Wenn die session von einem Systemadministrator mit der KILL-statement beendet wird.

Die folgenden Arten von Fehlern werden von einem CATCH-Block nicht behandelt, wenn sie auf der gleichen Ebene der Ausführung auftreten wie das TRY … CATCH-Konstrukt:

  1. Kompilieren Sie Fehler wie Syntaxerrors, die verhindern, dass ein Batch ausgeführt wird.
  2. Fehler, die bei der Neukompilierung auf statementsebene auftreten, wie z. B. objectnamen-Auflösungserrors, die nach der Kompilierung aufgrund einer verzögerten Namensauflösung auftreten.