Sdílet prostřednictvím


HOĎ (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vyvolá výjimku a přenese provádění do CATCH bloku try... Konstruktor CATCH.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

error_number

Konstanta nebo proměnná, která představuje výjimku. Argument error_number je int a musí být větší nebo roven 50 000 a menší nebo roven 2 147 483 647.

message

Řetězec nebo proměnná, která popisuje výjimku. Argument zprávy je nvarchar(2048).

state

Konstanta nebo proměnná mezi 0 a 255, která označuje stav, který se má přidružit ke zprávě. Argument stavu je tinyint.

Remarks

Stav vám pomůže identifikovat zdroj chyby v uložené proceduře, triggeru nebo dávce příkazu. Pokud například použijete stejnou zprávu na více místech, může vám jedinečná hodnota stavu pomoct najít, kde k chybě došlo.

Příkaz před THROW příkazem musí být následovaný ukončovacím znakem středníku (;).

TRY...CATCH Pokud není konstruktor dostupný, dávka příkazu se ukončí. Číslo řádku a postup, kde je vyvolána výjimka, jsou nastaveny. Závažnost je nastavena na 16hodnotu .

THROW Pokud je příkaz zadán bez parametrů, musí se objevit uvnitř CATCH bloku. To způsobí vyvolání zachycené výjimky. Jakákoli chyba, která nastane v THROW příkazu, způsobí ukončení dávky příkazu.

% je vyhrazený znak v textu THROW zprávy příkazu a musí být uchycený. Dvojitým znakem % , který se má vrátit % jako součást textu zprávy, například 'The increase exceeded 15%% of the original value'.

Rozdíly mezi RAISERROR a THROW

Následující tabulka uvádí rozdíly mezi RAISERROR a THROW příkazy.

Příkaz RAISERROR Příkaz THROW
Je-li msg_id předán RAISERROR, musí být ID definováno v sys.messages. Parametr error_number nemusí být definován v sys.messages.
Parametr msg_str může obsahovat printf styly formátování. Parametr zprávy nepřijímá printf formátování stylu.
Parametr závažnosti určuje závažnost výjimky. Neexistuje žádný parametr závažnosti . Při THROW použití k zahájení výjimky je závažnost vždy nastavena na 16. Pokud THROW se však použije k opětovnému zvětšování existující výjimky, je závažnost nastavena na úroveň závažnosti této výjimky.
Nepoctuje XACT_ABORT SET. Transakce se vrátí zpět, pokud je set XACT_ABORT .ON

Examples

A. Použití funkce THROW k vyvolání výjimky

Následující příklad ukazuje, jak použít THROW příkaz k vyvolání výjimky.

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

Tady je soubor výsledků.

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

B. Opětovné vyvolání výjimky pomocí funkce THROW

Následující příklad ukazuje, jak použít THROW příkaz k vyvolání poslední vyvolání výjimky znovu.

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;

Tady je soubor výsledků.

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. Použití FUNKCE FORMATMESSAGE s throw

Následující příklad ukazuje, jak použít funkci FORMATMESSAGE s THROW k vyvolání přizpůsobené chybové zprávy. Příklad nejprve vytvoří uživatelem definovanou chybovou zprávu pomocí sp_addmessage. THROW Vzhledem k tomu, že příkaz neumožňuje parametry nahrazení v parametru zprávy způsobem, který RAISERROR to dělá, FORMATMESSAGE se funkce používá k předání tří hodnot parametrů očekávaných chybovou zprávou 60000.

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;

Tady je soubor výsledků.

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