Žingsnis po žingsnio vadovas naudojant TRY ... CATCH apdoroti SQL Server klaidas

Nustatykite klaidas nepertraukdamos vykdymo

TRY ... CATCH pareiškimas Transact- SQL aptinka ir tvarko klaidų sąlygas jūsų duomenų bazių programose. Šis teiginys yra "SQL Server" klaidų valdymo kertinis akmuo ir yra svarbi tvirtų duomenų bazių programų kūrimo dalis. TRY ... CATCH taikomas SQL Server nuo 2008 m., Azure SQL duomenų bazė, Azure SQL duomenų saugykla ir lygiagrečių duomenų saugykla.

Pristatome TRY..CATCH

TRY ... CATCH veikia, leidžiant jums nurodyti du Transact-SQL pareiškimus: vieną, kurį norite "pabandyti", o kitą - naudoti "sugauti" bet kokias galimas klaidas. Kai SQL Server susiduria su TRY ... CATCH teiginiu, jis nedelsdamas vykdo pareiškimą, įtrauktą į TRY išlygą. Jei TRY teiginys sėkmingai vykdo, "SQL Server" paprasčiausiai juda. Tačiau, jei užrašas TRY sukuria klaidą, SQL Server užpildo CATCH ataskaitą, kad grakščiai tvarkytų klaidą.

Pagrindinė sintaksė naudojama šia forma:

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

TRY ... CATCH Pavyzdys

Lengviausia suprasti šio teiginio naudojimą naudodami pavyzdį. Įsivaizduokite, kad esate žmogiškųjų išteklių duomenų bazės administratorius, kuriame yra lentelė "Darbuotojai", kurioje yra informacijos apie kiekvieną jūsų organizacijos darbuotoją. Lentelėje pagrindinis raktas naudojamas kaip sveikasis skaitmuo. Galite bandyti naudoti toliau pateiktą teiginį, kad įterptumėte naują darbuotoją į savo duomenų bazę:

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

Esant normalioms aplinkybėms, šis teiginys pridės eilutę prie lentelės "Darbuotojai". Tačiau jei duomenų bazėje jau egzistuoja darbuotojas su ID 12497, eilutės įterpimas pažeidžia pagrindinį raktą ir sukelia tokią klaidą:

Msg 2627, 14 lygis, 1 būsena, 1 eilutė PRIMARY KEY apribojimo pažeidimas "PK_employee_id". Negalima įrašyti pasikartojančio rakto į objektą "dbo.employees". Pranešimas buvo nutrauktas.

Nors ši klaida pateikia jums informaciją, kurios reikia norint išspręsti problemą, yra dvi problemos. Pirma, žinutė yra paslaptinga. Jame yra klaidų kodai, eilučių numeriai ir kita informacija, nesuprantama vidutiniam vartotojui. Antra, ir dar svarbiau, tai sukelia teiginio nutraukimą ir gali sukelti programos triktį.

Alternatyva yra įrašyti teiginį TRY ... CATCH teiginyje, kaip parodyta žemiau:

BEGIN TRY INSERT INTO employees (id, first_name, last_name, extension) VERTYBĖS (12497, "Mike", "Chapple", 4201) END TRY BEGIN CATCH PRINT "Klaida:" + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Employee Mail', @recipients = 'hr@foo.com', @body = 'Įvyko klaida kuriant naują darbuotojų įrašą.', @subject = 'Darbuotojų ID kopijavimo klaida'; Pabaiga

Šiame pavyzdyje bet kokios klaidos, apie kurias pranešama, yra ir naudotojui, vykdančiam komandą, ir hr@foo.com el. Pašto adresą. Žemiau rodoma naudotojui pateikta klaida:

Klaida: PRIMARY KEY apribojimo "PK_employee_id" pažeidimas. Negalima įrašyti pasikartojančio rakto į objektą "dbo.employees". Paštas eilėje.

Svarbiausia, kad programos vykdymas tęsiasi paprastai, leidžiant programuotojui maloniai tvarkyti klaidą. Naudojimas TRY ... CATCH pareiškimas yra elegantiškas būdas aktyviai aptikti ir valdyti klaidas, kurios atsiranda SQL Server duomenų bazių programose.

Sužinokite daugiau

Jei norite sužinoti daugiau apie "Structured Query Language", perskaitykite " SQL įvedimas" .