Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Vyvolá výjimku a přenese provádění do CATCH bloku try... Konstruktor CATCH.
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).