Podrobná príručka používania funkcie TRY ... CATCH na spracovanie chýb servera SQL Server

Identifikujte chyby bez prerušenia vykonávania

Príkaz TRY ... CATCH v nástroji Transact- SQL zisťuje a zaobchádza s chybovými stavmi vo vašich databázových aplikáciách. Toto vyhlásenie je základným kameňom spracovania chýb SQL Serveru a je dôležitou súčasťou vývoja robustných databázových aplikácií. TRY ... CATCH sa vzťahuje na SQL Server od roku 2008, Azure SQL Database, Azure SQL Data Warehouse a Parallel Data Warehouse.

Predstavujeme TRY..CATCH

TRY ... CATCH funguje tak, že umožňuje špecifikovať dva príkazy Transact-SQL: jeden, ktorý chcete "vyskúšať" a druhý, ktorý sa má použiť na "zachytenie" akýchkoľvek možných chýb. Keď SQL Server narazí na príkaz TRY ... CATCH, okamžite vykoná vyhlásenie uvedené v klauzuli TRY. Ak sa príkaz TRY úspešne vykoná, SQL Server sa jednoducho presunie. Ak príkaz TRY vygeneruje chybu, SQL Server vykoná príkaz CATCH, aby túto chybu vyriešil.

Základná syntax má túto podobu:

ZAČAŤ TRI {sql_statement | statement_block} END TRY ZOČIŤ ZACHOVANIE [{sql_statement | statement_block}] KONEC ÚLOVKU [; ]

TRY ... Príklad výlovu

Najjednoduchšie je pochopiť použitie tohto vyhlásenia pomocou príkladu. Predstavte si, že ste správcom databázy ľudských zdrojov, ktorá obsahuje tabuľku s názvom Zamestnanci, ktorá obsahuje informácie o každom zamestnancov vo vašej organizácii. Táto tabuľka používa ako primárny kľúč celočíselné identifikačné číslo zamestnanca. Môžete sa pokúsiť použiť nižšie uvedené vyhlásenie na vloženie nového zamestnanca do vašej databázy:

INSERT INTO zamestnanci (id, first_name, last_name, extension) HODNOTY (12497, 'Mike', 'Chapple', 4201)

Za normálnych okolností by toto vyhlásenie pridalo do tabuľky Zamestnanci riadok. Ak však zamestnanec s ID 12497 už existuje v databáze, vloženie riadku by porušilo obmedzenie primárneho kľúča a malo za následok nasledujúcu chybu:

Msg 2627, Level 14, State 1, Line 1 Porušenie obmedzenia PRIMARY KEY "PK_employee_id". Nedá sa vložiť duplicitný kľúč do objektu 'dbo.employees'. Vyhlásenie bolo ukončené.

Aj keď vám táto chyba poskytuje informácie, ktoré potrebujete na riešenie problému, sú s ňou dva problémy. Po prvé, správa je tajná. Obsahuje kódy chýb, čísla riadkov a iné informácie, ktoré pre priemerného používateľa nie sú zrozumiteľné. Po druhé, a čo je dôležitejšie, spôsobí, že vyhlásenie preruší a mohlo by spôsobiť zlyhanie aplikácie.

Alternatívou je zabaliť vyhlásenie v príkaze TRY ... CATCH, ako je uvedené nižšie:

Začnite skúsiť INSERT INTO zamestnancov (id, first_name, last_name, extension) HODNOTY (12497, 'Mike', 'Chapple', 4201) END TRY ZOČIŤ TLAČ ZRUŠENIA 'Chyba:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Zamestnanecká pošta', @recipients = 'hr@foo.com', @body = 'Nastala chyba pri vytváraní nového záznamu zamestnancov.', @subject = 'Chyba duplikácie zamestnanca ID'; KONCOVÉ ZÁPACH

V tomto príklade sú všetky chyby, ktoré sa vyskytnú, hlásené užívateľovi, ktorý vykonal príkaz, a e-mailovú adresu hr@foo.com. Chyba zobrazená používateľovi sa zobrazí nižšie:

Chyba: Porušenie obmedzenia PRIMARY KEY 'PK_employee_id'. Nedá sa vložiť duplicitný kľúč do objektu 'dbo.employees'. Pošta vo fronte.

Najdôležitejšie je, že spustenie aplikácie pokračuje normálne, čo umožňuje programátorovi vyvážene zvládnuť chybu. Použitie príkazu TRY ... CATCH je elegantný spôsob proaktívneho zisťovania a spracovania chýb, ktoré sa vyskytujú v databázových aplikáciách SQL Server.

Viac informácií

Ak sa chcete dozvedieť viac o jazyku Štruktúrovaný dopyt, prečítajte si časť Úvod do SQL .