Canllaw Cam wrth Gam i ddefnyddio TRY ... CATCH i Ddefnyddio Gwallau Gweinyddwr SQL

Nodi gwallau heb dorri ar waith

Y TRY ... Mae datganiad CATCH yn Transact- SQL yn canfod ac yn trin cyflyrau gwall yn eich cronfa ddata. Mae'r datganiad hwn yn gonglfaen trin gwall Gweinyddwr SQL ac mae'n rhan bwysig o ddatblygu cymwysiadau cronfa ddata gadarn. TRY ... Mae CATCH yn berthnasol i SQL Server gan ddechrau gyda 2008, Azure SQL Database, Azure SQL Data Warehouse a Data Parasach Warws.

Cyflwyno TRY..CATCH

TRY ... Mae CATCH yn gweithio trwy ganiatáu i chi nodi dau ddatganiad Transact-SQL: un yr ydych am "geisio" ac un arall i'w ddefnyddio i "ddal" unrhyw wallau a allai godi. Pan fydd SQL Server yn dod ar draws TRY ... Datganiad CATCH, mae'n gweithredu'n syth ar y datganiad a gynhwysir yn y cymal TRY. Os yw'r datganiad TRY yn llwyddo'n llwyddiannus, mae SQL Server yn symud ymlaen. Fodd bynnag, os bydd y datganiad TRY yn creu gwall, mae SQL Server yn ymgymryd â datganiad CATCH i drin y gwall yn greisiol.

Mae'r cystrawen sylfaenol yn cymryd y ffurflen hon:

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

TRY ... Enghraifft CATCH

Mae'n haws deall y defnydd o'r datganiad hwn trwy ddefnyddio enghraifft. Dychmygwch eich bod chi'n weinyddwr cronfa ddata adnoddau dynol sy'n cynnwys tabl o'r enw "Gweithwyr," sy'n cynnwys gwybodaeth am bob un o'r gweithwyr yn eich sefydliad. Mae'r tabl hwnnw'n defnyddio rhif adnabod gweithiwr cyfanrif fel yr allwedd gynradd . Efallai y byddwch yn ceisio defnyddio'r datganiad isod i fewnosod gweithiwr newydd i'ch cronfa ddata:

INSERT INTO gweithwyr (id, enw cyntaf, enw olaf, estyniad) GWERTHOEDD (12497, 'Mike', 'Chapple', 4201)

O dan amgylchiadau arferol, byddai'r datganiad hwn yn ychwanegu rhes at y tabl Gweithwyr. Fodd bynnag, os yw gweithiwr â ID 12497 eisoes yn bodoli yn y gronfa ddata, byddai mewnosod y rhes yn torri'r cyfyngiad allweddol sylfaenol ac yn arwain at y gwall canlynol:

Msg 2627, Lefel 14, Wladwriaeth 1, Toriad Llinell 1 o gyfyngiad ALLWEDDOL ALLWEDDOL 'PK_employee_id'. Methu mewnosod allwedd dyblyg yn 'dbo.employees' gwrthrych. Mae'r datganiad wedi'i derfynu.

Er bod y gwall hwn yn rhoi'r wybodaeth sydd ei hangen arnoch i ddatrys y broblem, mae yna ddau fater ag ef. Yn gyntaf, mae'r neges yn cryptig. Mae'n cynnwys codau gwall, rhifau llinell a gwybodaeth arall na ellir ei deall i'r defnyddiwr ar gyfartaledd. Yn ail, ac yn bwysicach fyth, mae'n achosi i'r datganiad erthylu a gallai achosi damwain cais.

Y dewis arall yw lapio'r datganiad mewn TRY ... Datganiad CATCH, fel y dangosir isod:

BEGIN TRY INSERT INTO i weithwyr (id, enw cyntaf, enw olaf, estyniad) GWERTHOEDD (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN PRINT PRINT 'Gwall:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Post Gweithiwr', @recipients = 'hr@foo.com', @body = 'Digwyddodd gwall gan greu cofnod cyflogeion newydd.', @subject = 'Gwall Diwblodaeth ID Gweithiwr'; DIWEDD CATCH

Yn yr enghraifft hon, rhoddir gwybod i'r defnyddiwr sy'n gweithredu'r gorchymyn a chyfeiriad e-bost hr@foo.com unrhyw wallau sy'n digwydd. Mae'r gwall a ddangosir i'r defnyddiwr yn ymddangos isod:

Gwall: Torri cyfyngiad ALLWEDDOL ALLWEDDOL 'PK_employee_id'. Methu mewnosod allwedd dyblyg yn 'dbo.employees' gwrthrych. Bost wedi ciwio.

Yn bwysicaf oll, mae gweithredu ymgeisio yn parhau fel arfer, gan ganiatáu i'r rhaglenydd drin y gwall yn gryno. Defnyddio'r TRY ... Mae datganiad CATCH yn ffordd wych o ganfod a thrin gwallau rhagweithiol mewn cymwysiadau cronfa ddata SQL Server.

Dysgu Mwy

Os ydych chi eisiau dysgu mwy am yr Iaith Ymholiad Strwythuredig, darllenwch Cyflwyniad i SQL .