THROW (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric
Löst eine Ausnahme aus und überträgt die Ausführung an einen CATCH
Block eines TRY... CATCH-Konstrukt .
Transact-SQL-Syntaxkonventionen
Syntax
THROW [ { error_number | @local_variable }
, { message | @local_variable }
, { state | @local_variable } ]
[ ; ]
Argumente
error_number
Eine Konstante oder Variable, die die Ausnahme darstellt. Das argument error_number ist int und muss größer oder gleich 50.000 sein und kleiner als oder gleich 2.147.483.647 sein.
message
Eine Zeichenfolge oder Variable, die die Ausnahme beschreibt. Das Meldungsargument ist nvarchar(2048).
state
Eine Konstante oder Variable zwischen 0 und 255, die den Status angibt, der der Nachricht zugeordnet werden soll. Das Argument "State" ist "tinyint".
Hinweise
Verwenden Sie den Zustand , um die Quelle eines Fehlers in Der gespeicherten Prozedur, dem Trigger oder dem Anweisungsbatch zu identifizieren. Wenn Sie z. B. dieselbe Nachricht an mehreren Stellen verwenden, kann ein eindeutiger Zustandswert Ihnen helfen, zu ermitteln, wo der Fehler aufgetreten ist.
Die Anweisung vor der THROW
Anweisung muss mit dem Semikolon (;
)-Anweisungsterminator gefolgt werden.
Wenn ein TRY...CATCH
Konstrukt nicht verfügbar ist, wird der Anweisungsbatch beendet. Die Zeilennummer und die Prozedur, in der die Ausnahme ausgelöst wird, werden festgelegt. Der Schweregrad ist auf 16
.
Wenn die THROW
Anweisung ohne Parameter angegeben wird, muss sie innerhalb eines CATCH
Blocks angezeigt werden. Dies bewirkt, dass die abgefangene Ausnahme ausgelöst wird. Jeder Fehler, der in einer THROW
Anweisung auftritt, bewirkt, dass der Anweisungsbatch beendet wird.
%
ist ein reserviertes Zeichen im Nachrichtentext einer THROW
Anweisung und muss escapezeichen sein. Doppeltippen Sie das %
Zeichen, das als Teil des Nachrichtentexts zurückgegeben werden %
soll, z. B 'The increase exceeded 15%% of the original value'
. .
Unterschiede zwischen RAISERROR und THROW
In der folgenden Tabelle sind die Unterschiede zwischen RAISERROR und THROW
Anweisungen aufgeführt.
RAISERROR-Anweisung | THROW-Anweisung |
---|---|
Wenn eine msg_id übergeben RAISERROR wird, muss die ID in sys.messages definiert werden. |
Der parameter error_number muss nicht definiert sys.messages werden. |
Der parameter msg_str kann Formatierungsformatvorlagen enthalten printf . |
Der Nachrichtenparameter akzeptiert printf keine Formatvorlagenformatierung. |
Der Parameter severity gibt den Schweregrad der Ausnahme an. | Es gibt keinen Schweregradparameter . Wenn THROW zum Initiieren der Ausnahme verwendet wird, wird der Schweregrad immer auf .16 Wenn THROW sie jedoch verwendet wird, um eine vorhandene Ausnahme erneut zu begleichen, wird der Schweregrad dieser Ausnahme auf den Schweregrad dieser Ausnahme festgelegt. |
Berücksichtigt SET XACT_ABORT nicht. | Transaktionen werden zurückgesetzt , wenn SET XACT_ABORT ist ON . |
Beispiele
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;
Hier sehen Sie das Ergebnis.
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;
Hier sehen Sie das Ergebnis.
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
Das folgende Beispiel zeigt, wie Sie die FORMATMESSAGE-Funktion THROW
verwenden, um eine angepasste Fehlermeldung auszuwerfen. Zunächst wird im Bespiel eine benutzerdefinierte Fehlermeldung mithilfe von sp_addmessage
erstellt. Da die THROW
Anweisung die Ersetzungsparameter im Nachrichtenparameter nicht auf die gleiche Weise RAISERROR
zulässt, wird die FORMATMESSAGE
Funktion verwendet, um die drei Parameterwerte zu übergeben, die von der Fehlermeldung 60000
erwartet werden.
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;
Hier sehen Sie das Ergebnis.
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).