Step-by-Step-opas käyttämään TRY ... CATCH käsitellä SQL Server virheitä

Tunnista virheet keskeyttämättä suoritusta

TRY ... CATCH-lausuma Transact- SQL: ssä havaitsee ja käsittelee tietokannassovelluksissa esiintyvät virheet. Tämä toteamus on SQL Serverin virheenkäsittelyn kulmakivi ja se on tärkeä osa kehittää vankkoja tietokantaohjelmia. TRY ... CATCH koskee SQL Serveria vuodesta 2008 alkaen, Azure SQL -tietokanta, Azure SQL Data Warehouse ja Parallel Data Warehouse.

Esittely TRY..CATCH

TRY ... CATCH toimii antamalla sinun määrittää kaksi Transact-SQL-lausetta: yksi, jonka haluat "yrittää" ja toinen käyttämään "kiinni" mahdollisia virheitä. Kun SQL Server havaitsee TRY ... CATCH -lausuman, se suorittaa välittömästi TRY-lausekkeeseen sisältyvän lausunnon. Jos TRY-ilmoitus suoritetaan onnistuneesti, SQL Server yksinkertaisesti siirtyy. Jos TRY-ilmoitus kuitenkin synnyttää virheen, SQL Server suorittaa CATCH-käskyn käsittelemään virhettä huolellisesti.

Perussyntaksissa on seuraava muoto:

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

TRY ... CATCH Esimerkki

On helpointa ymmärtää tämän lausunnon käyttöä käyttämällä esimerkkiä. Kuvittele, että olet henkilöstötietokannan ylläpitäjä, joka sisältää taulukon nimeltä "Työntekijät", joka sisältää tietoja organisaatiosi kaikista työntekijöistä. Tämä taulukko käyttää ensisijaisena avaimenaan kokonaislukuisen työntekijän ID-numeron. Voit yrittää käyttää alla olevaa lausetta lisätäksesi uuden työntekijän tietokantaan:

INSERT INTO työntekijät (id, first_name, last_name, extension) ARVOT (12497, 'Mike', 'Chapple', 4201)

Normaalioloissa tämä lausuma lisää rivin Työntekijöiden taulukkoon. Jos tietokannassa on jo henkilö, jolla on tunnus 12497, rivin lisääminen rikkoisi ensisijaista avainrajoitusta ja seuraisi seuraavia virheitä:

Msg 2627, taso 14, tila 1, rivi 1 PRIMARY KEY -rajoituksen rikkominen "PK_employee_id". Ei voida lisätä päällekkäistä avainta objektissa 'dbo.employees'. Lausunto on päättynyt.

Vaikka tämä virhe tarjoaa sinulle ongelman vianmäärityksen, sen kanssa on kaksi ongelmaa. Ensinnäkin viesti on salaperäinen. Se sisältää virhekoodit, rivinumerot ja muut keskenään käsittelemättömät tiedot. Toiseksi, ja mikä tärkeintä, se aiheuttaa lausunnon keskeytymisen ja voi aiheuttaa sovelluksen kaatumisen.

Vaihtoehtona on kääriä lausunto TRY ... CATCH -ilmoituksessa, kuten alla on esitetty:

BEGIN TRY INSERT INTO työntekijät (ID, etunimi, viimeinen nimi, laajennus) ARVOT (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN CATCH PRINT 'Virhe:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Työntekijän sähköposti', @recipients = 'hr@foo.com', @body = 'Virhe tapahtui uuden työntekijärekisterin luomisesta.', @subject = 'Työntekijän tunnus päällekkäisyyksien virhe'; END CATCH

Tässä esimerkissä mahdolliset virheet raportoidaan sekä komennon suorittavalle käyttäjälle että hr@foo.com sähköpostiosoitteelle. Käyttäjällä näkyvä virhe ilmestyy alla:

Virhe: PRIMARY KEY -rajoituksen rikkominen "PK_employee_id". Ei voida lisätä päällekkäistä avainta objektissa 'dbo.employees'. Mail-jono.

Tärkeintä on, että sovelluksen suoritus jatkuu normaalisti, jolloin ohjelmoija voi käsitellä virheen huolellisesti. TRY ... CATCH -lausekkeen käyttö on tyylikäs tapa havaita ja käsitellä SQL Server -tietokantaohjelmissa esiintyviä virheitä.

Oppiminen lisää

Jos haluat lisätietoja strukturoidusta kyselykielestä, lue Johdatus SQL-muotoon .