Krok za krokem k použití TRY ... CATCH pro zacházení s chybami serveru SQL

Identifikujte chyby bez přerušení spuštění

Příkaz TRY ... CATCH v nástroji Transact- SQL rozpoznává a zpracovává chybové podmínky v databázových aplikacích. Toto prohlášení je základním kamenem zpracování chyb SQL Serveru a je důležitou součástí rozvíjení robustních databázových aplikací. TRY ... CATCH se vztahuje na SQL Server od roku 2008, Azure SQL Database, Azure SQL Data Warehouse a Parallel Data Warehouse.

Představujeme TRY..CATCH

TRY ... CATCH funguje tak, že umožňuje určit dvě příkazy Transact-SQL: jednu, kterou chcete "zkusit" a druhou použít, abyste "chytili" chyby, které by mohly vzniknout. Když SQL Server narazí na příkaz TRY ... CATCH, okamžitě provede příkaz zahrnutý v klauzuli TRY. Pokud příkaz TRY úspěšně spustí, SQL Server se jednoduše přesune. Pokud však příkaz TRY generuje chybu, SQL Server provede příkaz CATCH, aby tuto chybu vyřešil.

Základní syntaxe má tuto podobu:

ZAČÍVEJTE TRY {sql_statement | statement_block} END TRY ZAČÍNÁME ZRUŠENÍ [{sql_statement | statement_block}] KONEC ÚLOVKU [; ]

TRY ... Příklad výlovu

Nejjednodušší je pochopit použití tohoto prohlášení pomocí příkladu. Představte si, že jste správcem databáze lidských zdrojů, která obsahuje tabulku s názvem "Zaměstnanci", která obsahuje informace o všech zaměstnancích ve vaší organizaci. Tato tabulka používá jako primární klíč celé identifikační číslo zaměstnance. Pokud chcete do databáze vložit nový zaměstnanec, můžete se pokusit použít níže uvedené prohlášení:

INSERT INTO zaměstnanci (id, first_name, last_name, extension) HODNOTY (12497, 'Mike', 'Chapple', 4201)

Za normálních okolností by toto prohlášení přidalo řádek do tabulky Zaměstnanci. Pokud však zaměstnanec s ID 12497 již existuje v databázi, vložení řádku by porušilo omezení primárního klíče a způsobilo následující chybu:

Msg 2627, Level 14, State 1, Line 1 Porušení omezení PRIMARY KEY 'PK_employee_id'. Nelze vložit duplicitní klíč do objektu 'dbo.employees'. Prohlášení bylo ukončeno.

Přestože tato chyba poskytuje informace potřebné k vyřešení problému, existují s ním dva problémy. Nejprve je zpráva tajná. Obsahuje kódy chyb, čísla řádků a další informace, které pro průměrného uživatele nejsou srozumitelné. Za druhé, a co je ještě důležitější, způsobí, že prohlášení zruší a mohlo by způsobit selhání aplikace.

Alternativou je zabalit příkaz v příkazu TRY ... CATCH, jak je znázorněno níže:

BEGIN ZKUŠEJTE INSERT INTO na zaměstnance (id, first_name, last_name, extension) HODNOTY (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN ZRUŠENÍ TISKU 'Chyba:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Zaměstnanecká pošta', @recipients = 'hr@foo.com', @body = 'Došlo k chybě při vytváření nového záznamu zaměstnanců.', @subject = 'Chyba při duplikaci ID zaměstnance'; KONCOVÝ ÚLOVKOU

V tomto příkladu jsou všechny chyby, které se vyskytnou, hlášeny jak uživateli, který provádí příkaz, tak e-mailovou adresu hr@foo.com. Chyba zobrazená uživateli se zobrazí níže:

Chyba: Porušení omezení PRIMARY KEY 'PK_employee_id'. Nelze vložit duplicitní klíč do objektu 'dbo.employees'. Pošta ve frontě.

Nejdůležitější je, že běh aplikací pokračuje normálně, což umožňuje programátorovi lačně vyřešit chybu. Použití příkazu TRY ... CATCH je elegantní způsob, jak aktivně detekovat a zpracovat chyby, které se vyskytují v databázových aplikacích serveru SQL.

Další informace

Pokud se chcete dozvědět více o jazyce strukturovaných dotazů, přečtěte si Úvod do SQL .