Egy lépésről-lépésre útmutató a TRY ... CATCH használatához az SQL Server hibák kezeléséhez

A hibák azonosítása a végrehajtás megszakítása nélkül

A TRY ... CATCH utasítás a Transact- SQL-ben észleli és kezeli a hibahelyeket az adatbázis-alkalmazásokban. Ez az állítás az SQL Server hibakezelésének sarokköve, és fontos része a robusztus adatbázis-alkalmazások fejlesztésének. TRY ... CATCH az SQL Serverre vonatkozik 2008-tól, az Azure SQL adatbázisból, az Azure SQL Data Warehouse-ból és a Parallel Data Warehouse-ból.

A TRY..CATCH bemutatása

TRY ... CATCH működik, lehetővé téve, hogy két Transact-SQL kifejezést adjon meg: az egyik, amelyet "megpróbál", a másik pedig "felkaphat" minden esetlegesen felmerülő hibát. Amikor az SQL Server egy TRY ... CATCH utasítással találkozik, azonnal végrehajtja a TRY záradékban szereplő állítást. Ha a TRY utasítás sikeresen fut, akkor az SQL Server egyszerűen továbbhalad. Ha azonban a TRY utasítás hibát generál, az SQL Server végrehajtja a CATCH utasítást, hogy kíméletesen kezelje a hibát.

Az alapszintaxis ezt a formát veszi:

BEGIN TRY {sql_statement | statement_block} END TRY BEGIN CATCH [{sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCH Példa

A legegyszerűbb megérteni a nyilatkozat használatát egy példa felhasználásával. Képzelje el, hogy Ön egy olyan humánerőforrás-adatbázis rendszergazdája, amely egy "Employees" nevű táblát tartalmaz, amely információkat tartalmaz a szervezet összes alkalmazottjától. Ez az asztal elsődleges kulcsként egy teljes alkalmazott azonosító számot használ. Lehet, hogy az alábbi nyilatkozatot próbálja felhasználni az új alkalmazottak új adatbázishoz:

INSERT INTO alkalmazottak (id, first_name, last_name, extension) VALUES (12497, 'Mike', 'Chapple', 4201)

Normál körülmények között ez a nyilatkozat egy sorot ad hozzá az Alkalmazottak táblázatához. Ha azonban az adatbázisban már létezik egy 12497-es azonosító, a sor beillesztése sértené az elsődleges kulcskorlátot, és a következő hibát eredményezheti:

Msg 2627, 14. szint, 1. állapot, 1. sor A PRIMARY KEY megszorítása "PK_employee_id". A "dbo.employees" objektum nem helyezhető be duplikált kulcsba. A kijelentés befejeződött.

Bár ez a hiba a problémamegoldáshoz szükséges információkat biztosítja, két probléma van vele. Először is, az üzenet rejtélyes. Ez magában foglalja a hibakódokat, vonalszámokat és egyéb információkat, amelyek az átlag felhasználó számára érthetetlenek. Másodszor, és még ennél is fontosabb, az abbahagyja az állítást, és az alkalmazás összeomlik.

Az alternatíva az, hogy a nyilatkozatot egy TRY ... CATCH utasításban csomagoljuk, az alábbiak szerint:

BEGIN TRY INSERT INTO alkalmazottak (id, first_name, last_name, extension) VALUES (12497, 'Mike', 'Chapple', 4201) EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Munkavállalói levelezés', @recipients = 'hr@foo.com', @body = 'Hiba történt egy új munkatárs rekord létrehozásával kapcsolatban.', @subject = 'Munkavállalói azonosító párhuzamos hiba'; END CATCH

Ebben a példában minden előforduló hiba jelentkezik mind a parancsot futtató felhasználóhoz, mind a hr@foo.com e-mail címhez. A felhasználónak jelzett hiba az alábbiakban látható:

Hiba: PRIMARY KEY megsértése "PK_employee_id". A "dbo.employees" objektum nem helyezhető be duplikált kulcsba. Mail sorban áll.

A legfontosabb, hogy az alkalmazás végrehajtása normálisan folytatódik, lehetővé téve a programozó számára, hogy kíméletesen kezelje a hibát. A TRY ... CATCH utasítás használata elegáns módja az SQL Server adatbázis-alkalmazásokban előforduló hibák proaktív észlelésére és kezelésére.

Többet megtudni

Ha szeretne többet megtudni a strukturált lekérdezési nyelvről, olvassa el a Bevezetés az SQL-be .