Freigeben über


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 RAISERRORwird, muss die ID in sys.messagesdefiniert werden. Der parameter error_number muss nicht definiert sys.messageswerden.
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 60000erwartet 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).