Behandeln von Fehlern von remote gespeicherten Server-zu-Server-Prozeduren

Wenn Sie remote gespeicherte Prozeduren und Batches aus einer lokalen Instanz von SQL Server auf einem Client ausführen, können Anweisungs- und Batchabbruchfehler auftreten:

  • Wenn ein Anweisungsabbruchfehler auftritt, wird die Anweisung, die den Fehler verursacht hat, abgebrochen, die Ausführung der remote gespeicherten Prozedur oder des Batches wird jedoch fortgesetzt.

  • Wenn ein Batchabbruchfehler auftritt, wird die Ausführung der gesamten remote gespeicherten Prozedur oder des Batches beendet.

  • Wenn remote gespeicherte Prozeduren und Batches im Bereich eines TRY-Blocks ausgeführt werden, können Batchabbruchfehler durch das TRY…CATCH-Konstrukt behandelt werden.

Das Verhalten remote gespeicherter Prozeduren und Batches, das sich aus Anweisungs- und Batchabbruchfehlern ergibt, hängt von der SET XACT_ABORT-Einstellung des lokalen Servers ab.

SET XACT_ABORT ist OFF

Wenn SET XACT_ABORT auf dem lokalen Server OFF ist, werden alle Anweisungsabbruchfehler in der remote gespeicherten Prozedur als Anweisungsabbruchfehler vom lokalen Server an den Client weitergegeben. Nur die Anweisung, die den Fehler verursacht hat, wird beendet. Der Client empfängt Fehlermeldungen, die den Anweisungsabbruchfehlern entsprechen. Außerdem gibt @@ERROR den Wert 0 zurück, wenn die remote gespeicherte Prozedur bis zu ihrem Abschluss ausgeführt wird. Wenn der Fehler im Bereich eines TRY-Blocks auftritt, wird die Ausführung fortgesetzt, und der CATCH-Block wird nicht aufgerufen.

Alle Batchabbruchfehler in der remote gespeicherten Prozedur werden vom lokalen Server an den Client weitergegeben. Die EXECUTE-Anweisung, die die remote gespeicherte Prozedur aufgerufen hat, wird beendet, die Ausführung des Batches oder der gespeicherten Prozedur, der bzw. die die EXECUTE-Anweisung enthält, wird jedoch fortgesetzt. Daher gibt @@ERROR den Fehlercode zurück, der dem Fehler entspricht, der die remote gespeicherte Prozedur beendet hat; der Rückgabewert der gespeicherten Prozedur ist NULL. Wenn die remote gespeicherte Prozedur, die einen Fehler generiert, im Bereich eines TRY-Blocks auf dem lokalen Server ausgeführt wird, bewirkt der Fehler, dass die Steuerung mit Informationen zum letzten Fehler auf dem Remoteserver an den CATCH-Block übergeben wird.

Wenn Sie die Problembehebung von Fehlern ausführen, führen Sie eine remote gespeicherte Prozedur aus dem TRY-Block eines TRY…CATCH-Konstrukts aus. Wenn die remote gespeicherte Prozedur nicht erfolgreich abgeschlossen wird, springt die Ausführung mit Informationen zum letzten Fehler auf dem Remoteserver zum zugehörigen CATCH-Block auf dem lokalen Server. Wenn die remote gespeicherte Prozedur erfolgreich abgeschlossen wurde, fährt die Ausführung innerhalb des TRY-Blocks auf dem lokalen Server fort, und der Rückgabewert der remote gespeicherten Prozedur kann verwendet werden.

Wenn Sie eine remote gespeicherte Prozedur außerhalb des Bereichs eines TRY-Blocks ausführen, können Sie alternativ @@ERROR am Ende der remote gespeicherten Prozedur untersuchen, um zu bestimmen, ob die Remoteprozedur abgeschlossen wurde. Wenn @@ERROR den Wert 0 besitzt, wurde die remote gespeicherte Prozedur erfolgreich ausgeführt, und der Rückgabewert der gespeicherten Prozedur kann verwendet werden. Wenn @@ERROR einen Wert ungleich 0 besitzt, wurde die remote gespeicherte Prozedur nicht erfolgreich ausgeführt, und der Rückgabewert der gespeicherten Prozedur kann nicht verwendet werden.

SET XACT_ABORT ist ON

Wenn SET XACT_ABORT auf dem lokalen Server ON ist, wird diese Einstellung an den Verbindungsserver weitergegeben. Alle Anweisungs- und Batchabbruchfehler in der remote gespeicherten Prozedur werden in Batchabbruchfehler auf dem lokalen Server konvertiert. Daher wird die Ausführung des Batches oder der gespeicherten Prozedur, der bzw. die die remote gespeicherte Prozedur aufgerufen hat, zusammen mit der remote gespeicherten Prozedur beendet. Wenn die remote gespeicherte Prozedur, die einen Fehler generiert, im Bereich eines TRY-Blocks auf dem lokalen Server ausgeführt wird, bewirkt der Fehler, dass die Steuerung mit Informationen zum letzten Fehler auf dem Remoteserver an den CATCH-Block übergeben wird.

Wenn eine remote gespeicherte Prozedur außerhalb des Bereichs eines TRY-Blocks ausgeführt wird, können Sie den Wert von @@ERROR nicht untersuchen, um zu bestimmen, ob ein Batchfehler aufgetreten ist, weil die Anweisung nach der EXECUTE-Anweisung nicht ausgeführt wird. Führen Sie eine remote gespeicherte Prozedur daher aus dem TRY-Block eines TRY…CATCH-Konstrukts aus. Wenn die remote gespeicherte Prozedur nicht erfolgreich abgeschlossen wird, springt die Ausführung mit Informationen zum letzten Fehler auf dem Remoteserver zum zugehörigen CATCH-Block auf dem lokalen Server. Wenn die remote gespeicherte Prozedur erfolgreich abgeschlossen wurde, fährt die Ausführung innerhalb des TRY-Blocks auf dem lokalen Server fort, und der Rückgabewert der remote gespeicherten Prozedur kann verwendet werden.

RAISERROR und TRY…CATCH

Wenn RAISERROR mit einem Schweregrad von unter 20 aus einer remote gespeicherten Prozedur aufgerufen wird, wird ein Anweisungsabbruchfehler auf dem Remoteserver ausgelöst. Ein TRY…CATCH-Konstrukt auf dem lokalen Server behandelt nur Remotebatch-Abbruchfehler. Wenn eine remote gespeicherte Prozedur RAISERROR mit einem Schweregrad von unter 20 aufruft und die remote gespeicherte Prozedur im Bereich eines TRY-Blocks auf dem lokalen Server ausgeführt wird, bewirkt RAISERROR nicht, dass die Steuerung an den CATCH-Block des TRY...CATCH-Konstrukts übergeben wird. RAISERROR mit einem Schweregrad von 20 oder höher auf dem Remoteserver unterbricht jedoch die Verbindung, und die Ausführung auf dem lokalen Server wird an den CATCH-Block übergeben.