TRY / CATCH-toiminnon käyttäminen SQL Server -virheiden käsittelemiseen

Transact-SQL: n TRY / CATCH-käsky havaitsee ja käsittelee virhetilat tietokantasovelluksissa. Tämä lausunto on SQL Palvelinvirheiden käsittely ja on tärkeä osa kestävien tietokantasovellusten kehittämistä.

TRY / CATCH koskee SQL Serveriä vuodesta 2008 alkaen, Azure SQL Database, Azure SQL Data Warehouse ja Parallel Data Warehouse.

Esittelyssä TRY / CATCH

TRY./CATCH toimii määrittämällä kaksi Transact-SQL-käskyä: yksi, jonka haluat "kokeilla", ja toinen, jota käytetään "kiinni" mahdollisiin virheisiin. Kun SQL Server kohtaa TRY / CATCH-käskyn, se suorittaa välittömästi TRY-lausekkeeseen sisältyvän lauseen. Jos TRY-käsky suoritetaan onnistuneesti, SQL Server siirtyy eteenpäin. Jos TRY-käsky kuitenkin tuottaa virheen, SQL Server suorittaa CATCH-käskyn käsittelemään virhettä sulavasti.

Perussyntaksin muoto on seuraava:

ALOITA KOKEILU
{sql_statement | lauseen esto}
LOPETA KOKEILE
Aloita saalis
[{sql_statement | lause_block}]
LOPPU SAALIIN
[; ]

Kokeile / saalis Esimerkki

Harkitse henkilöstötietokantaa, joka sisältää nimitetyn taulukon

instagram viewer
työntekijät, joka sisältää tietoja jokaisesta yrityksen työntekijästä. Tuo taulukko käyttää työntekijöiden kokonaislukua pääavain.

Voit yrittää lisätä alla olevaa lausetta uuden työntekijän lisäämiseen tietokantaan:

INSERT INTO työntekijät (tunnus, etunimi, sukunimi, laajennus)
ARVOT (12497, 'Mike', 'Chapple', 4201)

Normaaleissa olosuhteissa tämä lause lisäisi rivin työntekijöiden taulukkoon. Jos kuitenkin työntekijä, jolla on tunnus 12497, on jo tietokannassa, rivin lisääminen rikkoo ensisijaisen avaimen rajoitusta ja aiheuttaisi seuraavan virheen:

Viesti 2627, taso 14, tila 1, rivi 1
PRIMARY KEY -rajoituksen 'PK_employee_id' rikkominen. Kohteen 'dbo.employees' kaksoiskoodia ei voi lisätä.
Lausunto on lopetettu.

Vaikka tämä virhe antaa sinulle tarvittavat tiedot ongelman vianmääritykseen, siinä on kaksi ongelmaa. Ensinnäkin viesti on salainen. Se sisältää virhekoodit, rivinumerot ja muut tiedot, joita keskimääräinen käyttäjä ei ymmärrä. Toiseksi ja mikä tärkeintä, se saa lauseen keskeytymään ja voi aiheuttaa sovelluksen kaatumisen.

Vaihtoehto on kääriä käsky TRY… CATCH-käskyyn, kuten tässä on esitetty:

ALOITA KOKEILU
INSERT INTO työntekijät (tunnus, etunimi, sukunimi, laajennus)
ARVOT (12497, 'Mike', 'Chapple', 4201)
LOPETA KOKEILE
Aloita saalis
TULOSTA VIRHE: + ERROR_MESSAGE ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Työntekijän sähköposti',
@recipients = '[email protected]',
@body = 'Uuden työntekijätietueen luomisessa tapahtui virhe.',
@subject = 'Työntekijöiden tietokantavirhe';
LOPPU SAALIIN

Tässä esimerkissä mahdollisista virheistä raportoidaan sekä komennon suorittavalle käyttäjälle että [email protected] -sähköpostiosoitteelle. Käyttäjälle osoitettu virhe on:

Virhe: PRIMARY KEY -rajoituksen 'PK_employee_id' rikkominen. 
Kohteen 'dbo.employees' kaksoiskoodia ei voi lisätä.
Posti jonossa.

Sovelluksen suorittaminen jatkuu normaalisti, jolloin ohjelmoija pystyy käsittelemään virheen. TRY / CATCH-käskyn käyttö on tyylikäs tapa havaita ja käsitellä ennakoivasti SQL Server -tietokantasovelluksissa esiintyviä virheitä.

Lisätietoja

Lisätietoja rakenteisesta kyselykielestä on artikkelissamme SQL: n perusteet.