Soli pa solim, izmantojot TRY ... CATCH, lai apstrādātu SQL Server kļūdas

Noteikt kļūdas, nepārtraucot izpildi

TRY ... CATCH paziņojums Transact- SQL detektē un apstrādā kļūdu nosacījumus jūsu datu bāzu lietojumprogrammās. Šis paziņojums ir SQL Server kļūdu apstrādes stūrakmens, un tā ir nozīmīga daļa no spēcīgu datu bāzu lietojumprogrammu izstrādes. TRY ... CATCH attiecas uz SQL Server, sākot ar 2008. gadu, Azure SQL datu bāzi, Azure SQL datu noliktavu un Parallel Data Warehouse.

Iepazīstinām ar TRY..CATCH

TRY ... CATCH darbojas, ļaujot jums norādīt divus Transact-SQL paziņojumus: vienu, kuru vēlaties izmēģināt, bet otru, lai izmantotu, lai "nozagtu" visas iespējamās kļūdas. Kad SQL Server saskaras ar TRI ... CATCH paziņojumu, tas nekavējoties izpilda paziņojumā iekļauto TRY klauzulu. Ja TRY paziņojums veiksmīgi izpildīts, SQL Server vienkārši pārvietojas. Tomēr, ja TRY paziņojums rada kļūdu, SQL Server izpilda CATCH paziņojumu, lai graciozi rīkotos ar kļūdu.

Pamata sintakse izmanto šo formu:

BEGIN TRY {sql_statement | statement_block} END TRY START SĒDEKĻA [{sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCH piemērs

Visvieglāk ir izprast šī apgalvojuma lietošanu, izmantojot piemēru. Iedomājieties, ka esat cilvēkresursu datubāzes administrators, kurā ir tabula ar nosaukumu "Darbinieki", kurā ir informācija par katru no jūsu uzņēmuma darbiniekiem. Šajā tabulā primārā atslēga tiek izmantota veselu skaitļu darbinieku identifikācijas numurs. Iespējams mēģināt izmantot tālāk redzamo paziņojumu, lai ievietotu jaunu darbinieks savā datubāzē:

INSERT INTO darbiniekiem (id, first_name, last_name, extension) VĒRTĪBAS (12497, 'Mike', 'Chapple', 4201)

Normālos apstākļos šis paziņojums rindu pievienotu tabulai Darbinieki. Tomēr, ja darbinieks ar ID 12497 jau ir datu bāzē, rindas ievietošana pārkāpj primāro atslēgas ierobežojumu un radīs šādu kļūdu:

Msg 2627, 14. līmenis, 1. stāvoklis, 1. rinda PRIMARY KEY ierobežojuma pārkāpums "PK_employee_id". Nevar ievietot dublējošo atslēgu objektā 'dbo.employees'. Paziņojums ir izbeigts.

Kaut arī šī kļūda sniedz jums informāciju, kas nepieciešama problēmu novēršanai, ar to ir divi jautājumi. Pirmkārt, ziņa ir noslēpumaina. Tajā ir ietverti kļūdas kodi, rindu numuri un cita informācija, kas nesaprotami vidējam lietotājam. Otrkārt, un vēl svarīgāk, tas izraisa paziņojumu pārtraukt un var izraisīt pieteikuma avāriju.

Alternatīva ir iekļaut paziņojumu TRY ... CATCH paziņojumā, kā parādīts zemāk:

NOSLĒDZIES IESNIEGT darbiniekus (id, first_name, last_name, extension) VĒRTĪBAS (12497, 'Mike', 'Chapple', 4201) END TRY SĀKOTIES PRINT 'Kļūda:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Darbinieku pasts', @recipients = 'hr@foo.com', @body = 'Radās kļūda, izveidojot jaunu darbinieku ierakstu.', @subject = 'Darbinieku ID atkārtojuma kļūda'; END CATCH

Šajā piemērā visas iespējamās kļūdas tiek ziņotas gan lietotājam, kas izpilda komandu, gan hr@foo.com e-pasta adresi. Parādīta lietotājam parādītā kļūda:

Kļūda: PRIMARY KEY ierobežojuma pārkāpums "PK_employee_id". Nevar ievietot dublējošo atslēgu objektā 'dbo.employees'. Pasta rindā.

Vissvarīgākais - lietojumprogrammu izpilde turpinās normāli, ļaujot programmētājam graciozi apstrādāt kļūdu. TRY ... CATCH paziņojums ir elegants veids, kā aktīvi atklāt un novērst kļūdas, kas rodas SQL Server datu bāzu lietojumprogrammās.

Mācīties vairāk

Ja vēlaties uzzināt vairāk par strukturēto vaicājumu valodu, izlasiet sadaļu Ievads SQL .