Megosztás a következőn keresztül:


DOBÁS (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Kivételt emel ki, és a végrehajtást a TRY blokkjára CATCH továbbítja ... CATCH szerkezet.

Transact-SQL szintaxis konvenciók

Syntax

THROW [ { error_number | @local_variable }
    , { message | @local_variable }
    , { state | @local_variable } ]
[ ; ]

Arguments

error_number

A kivételt jelképező állandó vagy változó. A error_number argumentum int, és 50 000-nél nagyobbnak vagy egyenlőnek kell lennie, és kisebbnek vagy egyenlőnek kell lennie, mint 2 147 483 647.

message

A kivételt leíró sztring vagy változó. Az üzenet argumentuma nvarchar(2048).

state

0 és 255 közötti állandó vagy változó, amely az üzenethez társítandó állapotot jelzi. Az állapotargumentum kicsi.

Remarks

Állapot használatával azonosíthatja a tárolt eljárás, eseményindító vagy utasítás kötegben található hiba forrását. Ha például ugyanazt az üzenetet több helyen használja, egy egyedi állapotérték segíthet megtalálni a hiba helyét.

Az utasítás előtti THROW utasítást a pontosvessző (;) utasítás terminátorának kell követnie.

Ha egy TRY...CATCH szerkezet nem érhető el, az utasítás köteg leáll. A sorszám és az eljárás, ahol a kivétel keletkezik, be van állítva. A súlyosság értéke .16

Ha az THROW utasítás paraméterek nélkül van megadva, egy blokkban CATCH kell megjelennie. Ez miatt a kivétel ki van emelve. Az utasításban THROW előforduló hibák miatt az utasítás köteg leáll.

% egy utasítás üzenetszövegében THROW foglalt karakter, amelyet meg kell szökni. Dupla karaktert % ad vissza % például az üzenetszöveg 'The increase exceeded 15%% of the original value'részeként.

Különbségek a RAISERROR és a THROW között

Az alábbi táblázat a RAISERROR és THROW az utasítások közötti különbségeket sorolja fel.

RAISERROR állítás THROW nyilatkozat
Ha egy msg_id ad át RAISERROR, az azonosítót a következőben sys.messageskell definiálni: . A error_number paramétert nem kell definiálni a következőben sys.messages: .
A msg_str paraméter formázási stílusokat tartalmazhat printf . Az üzenetparaméter nem fogadja el printf a stílusformázást.
A súlyossági paraméter a kivétel súlyosságát határozza meg. Nincs súlyossági paraméter. Amikor THROW a kivétel kezdeményezésére szolgál, a súlyosság mindig a következőre 16van állítva: . THROW Ha azonban egy meglévő kivétel visszaállítására használják, a súlyosság az adott kivétel súlyossági szintjére van állítva.
Nem tiszteli a SET XACT_ABORT. A tranzakciók vissza lesznek állítva, ha a SET XACT_ABORT .ON

Examples

A. Kivétel létrehozása a THROW használatával

Az alábbi példa bemutatja, hogyan lehet az THROW utasítás használatával kivételt emelni.

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

Itt van az eredmények összessége.

Msg 51000, Level 16, State 1, Line 1
The record does not exist.

B. A THROW használatával ismét kivételt emelhet

Az alábbi példa bemutatja, hogyan használhatja az THROW utasítást az utolsó kidobott kivétel ismételt kiemelésére.

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;

Itt van az eredmények összessége.

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. A FORMATMESSAGE használata a THROW használatával

Az alábbi példa bemutatja, hogyan használhatja a FORMATMESSAGE függvényt THROW egy testreszabott hibaüzenet küldéséhez. A példa először létrehoz egy felhasználó által definiált hibaüzenetet a használatával sp_addmessage. Mivel az THROW utasítás nem teszi lehetővé a helyettesítési paramétereket az üzenetparaméterbenRAISERROR, a függvény a FORMATMESSAGE hibaüzenet 60000által várt három paraméterérték átadására szolgál.

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;

Itt van az eredmények összessége.

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).