THROW (Transact-SQL)

 

DIESES THEMA GILT FÜR:jaSQL Server (ab 2012)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse

Löst eine Ausnahme aus und übergibt die Ausführung an einem CATCH-Block eines TRY…CATCH-Konstrukts in SQL Server 2016.

Topic link icon Transact-SQL-Syntaxkonventionen

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
  
THROW [ { error_number | @local_variable },  
        { message | @local_variable },  
        { state | @local_variable } ]   
[ ; ]  

error_number
Eine Konstante oder Variable, die die Ausnahme darstellt. Error_number ist Int muss größer als oder gleich 50000 und kleiner oder gleich 2147483647 sein.

Nachricht
Eine Zeichenfolge oder Variable, die die Ausnahme beschreibt. Nachricht ist nvarchar(2048).

Status
Ist eine Konstante oder Variable zwischen 0 und 255, die den Status angibt, der der Nachricht zugeordnet werden soll. Status ist "tinyint".

Auf die Anweisung vor der THROW-Anweisung muss als Anweisungsabschlusszeichen das Semikolon (;) folgen.

Wenn kein TRY…CATCH-Konstrukt verfügbar ist, wird die Sitzung beendet. Die Zeilennummer und die Prozedur, in der die Ausnahme ausgelöst wird, werden festgelegt. Der Schweregrad wird auf 16 festgelegt.

Wenn die THROW-Anweisung ohne Parameter angegeben wird, muss sie in einem CATCH-Block enthalten sein. Dies bewirkt, dass die abgefangene Ausnahme ausgelöst wird. Jeder in einer THROW-Anweisung auftretende Fehler führt dazu, dass der Anweisungsbatch beendet wird.

% ist ein reserviertes Zeichen im Nachrichtentext einer THROW-Anweisung und muss mit Escapezeichen versehen werden. Verwenden Sie ein weiteres Prozentzeichen, damit % als Teil des Nachrichtentextes zurückgegeben wird, z. B. "Der Anstieg überschreitet den ursprünglichen Wert um 15 %%."

In der folgenden Tabelle werden Unterschiede zwischen der RAISERROR-Anweisung und der THROW-Anweisung aufgeführt.

RAISERROR-AnweisungTHROW-Anweisung
Wenn eine Msg_id übergeben wird, RAISERROR, muss die ID in sys.messages definiert werden.Die Error_number Parameter enthält keinen in sys.messages definiert werden.
Die Msg_str kann Parameter enthalten Printf -Formatvorlagen.Die Nachricht Parameter akzeptiert keine Printf -Formatierung.
Die Schweregrad Parameter gibt den Schweregrad der Ausnahme.Es ist keine Schweregrad Parameter. Der Ausnahmeschweregrad ist immer auf 16 festgelegt.

A. Verwenden von THROW zum Auslösen einer Ausnahme

Im folgenden Beispiel wird gezeigt, wie die THROW-Anweisung zum Auslösen einer Ausnahme verwendet wird.

THROW 51000, 'The record does not exist.', 1;  

Im Folgenden finden Sie das Resultset.

Msg 51000, Level 16, State 1, Line 1

The record does not exist.

B. Verwenden von THROW zum erneuten Auslösen einer Ausnahme

Im folgenden Beispiel wird gezeigt, wie die THROW-Anweisung verwendet wird, um die zuletzt ausgelöste Ausnahme erneut auszulösen.

USE tempdb;  
GO  
CREATE TABLE dbo.TestRethrow  
(    ID INT PRIMARY KEY  
);  
BEGIN TRY  
    INSERT dbo.TestRethrow(ID) VALUES(1);  
--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.  
    INSERT dbo.TestRethrow(ID) VALUES(1);  
END TRY  
BEGIN CATCH  
  
    PRINT 'In catch block.';  
    THROW;  
END CATCH;  
  

Im Folgenden finden Sie das Resultset.

PRINT 'In catch block.';

Msg 2627, Level 14, State 1, Line 1

Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.

The statement has been terminated.

C. Verwenden von FORMATMESSAGE mit THROW

Im folgenden Beispiel wird gezeigt, wie die FORMATMESSAGE-Funktion mit THROW verwendet wird, um eine benutzerdefinierte Fehlermeldung auszulösen. Zunächst wird im Bespiel eine benutzerdefinierte Fehlermeldung mithilfe von sp_addmessage erstellt. Da die THROW-Anweisung keine Ersetzungsparameter im zulässt der Nachricht Parameter in der Weise, die RaiseError der FORMATMESSAGE-Funktion wird verwendet, um die drei von Fehlermeldung 60000 erwarteten Parameterwerte übergeben.

EXEC sys.sp_addmessage  
     @msgnum   = 60000  
,@severity = 16  
,@msgtext  = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).'  
    ,@lang = 'us_english';   
GO  
  
DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string');   
  
THROW 60000, @msg, 1;  
  

Im Folgenden finden Sie das Resultset.

Msg 60000, Level 16, State 1, Line 2

This is a test message with one numeric parameter (500), one string parameter (First string), and another string parameter (second string).

D. Verwenden von THROW zum Auslösen einer Ausnahme

Im folgenden Beispiel wird gezeigt, wie die THROW-Anweisung zum Auslösen einer Ausnahme verwendet wird.

THROW 51000, 'The record does not exist.', 1;  

Im Folgenden finden Sie das Resultset.

Msg 51000, Level 16, State 1, Line 1

The record does not exist.

FORMATMESSAGE (Transact-SQL)
Datenbankmodulfehlern
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
RAISERROR (Transact-SQL)
@@ERROR (Transact-SQL)
GOTO (Transact-SQL)
GESTARTET... Ende (Transact-SQL)
XACT_STATE (Transact-SQL)
SET XACT_ABORT (Transact-SQL)

Community-Beiträge

HINZUFÜGEN
Anzeigen: