Gwida pass-pass għall-Użu ta 'TRY ... QABDA biex timmaniġġa Żbalji tas-SQL Server

Identifika żbalji mingħajr ma tinterrompi l-eżekuzzjoni

Id-dikjarazzjoni TRY ... CATCH fi Transact- SQL jiskopri u jittratta l-kondizzjonijiet ta 'żball fl-applikazzjonijiet tad-database tiegħek. Din id-dikjarazzjoni hija l-pedament ta 'l-immaniġġjar ta' l-iżbalji ta 'SQL Server u hija parti importanti ta' l-iżvilupp ta 'applikazzjonijiet ta' database robusti. TRY ... QABDA tapplika għal SQL Server li tibda bl-2008, Azure Database SQL, Azure SQL Data Warehouse u Parallel Data Warehouse.

L-introduzzjoni ta 'TRY..CATCH

TRY ... CATCH taħdem billi tkun tista 'tispeċifika żewġ dikjarazzjonijiet Transact-SQL: waħda li tixtieq "tipprova" u ieħor biex tuża "qabda" kull żball li jista' jinqala '. Meta SQL Server jiltaqa 'ma' TRY ... dikjarazzjoni CATCH, minnufih tesegwixxi d-dikjarazzjoni inkluża fil-klawżola TRY. Jekk id-dikjarazzjoni TRY tesegwixxi b'suċċess, SQL Server sempliċiment imur fuq. Madankollu, jekk id-dikjarazzjoni TRY tiġġenera żball, SQL Server jeżegwixxi d-dikjarazzjoni CATCH biex jimmaniġġja l-iżball b'mod grazzjuż.

Is-sintassi bażika tieħu din il-forma:

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

TRY ... CATCH Eżempju

Huwa eħfef li tifhem l-użu ta 'din id-dikjarazzjoni permezz tal-użu ta' eżempju. Immaġina li int l-amministratur ta 'database tar-riżorsi umani li fiha tabella bl-isem "Impjegati", li fiha informazzjoni dwar kull impjegat fl-organizzazzjoni tiegħek. Dik it-tabella tuża numru ta 'ID tal-impjegat numru sħiħ bħala ċ -ċavetta primarja . Int tista 'tipprova tuża d-dikjarazzjoni hawn taħt biex inserixxi impjegat ġdid fid-database tiegħek:

INSERT INTO impjegati (id, first_name, last_name, extension) VALURI (12497, 'Mike', 'Chapple', 4201)

F'ċirkostanzi normali, din id-dikjarazzjoni żżid ringiela mal-mejda tal-Impjegati. Madankollu, jekk impjegat bl-ID 12497 diġà jeżisti fid-database, l-inseriment tar-ringiela jikser ir-restrizzjoni ewlenija ewlenija u jirriżulta fl-iżball li ġej:

Msg 2627, Livell 14, Stat 1, Linja 1 Ksur tar-restrizzjoni PRIMARY KEY 'PK_employee_id'. Ma tistax tiddaħħal ċavetta duplikata fl-oġġett "dbo.employees". Id-dikjarazzjoni ntemmet.

Filwaqt li dan l-iżball jipprovdilek l-informazzjoni li għandek bżonn biex issolvi l-problema l-problema, hemm żewġ kwistjonijiet magħha. L-ewwelnett, il-messaġġ huwa kriptiku. Jinkludi kodiċijiet ta 'żball, numri tal-linja u informazzjoni oħra mhux intelliġibbli għall-utent medju. It-tieni, u aktar importanti, tikkawża li l-istqarrija tbatti u tista 'tikkawża waqgħa fl-applikazzjoni.

L-alternattiva hija li nħejju d-dikjarazzjoni fi TRY ... dikjarazzjoni CATCH, kif muri hawn taħt:

BEGIN TRY INSERT INTO impjegati (id, first_name, last_name, extension) VALURI (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN IMPRIMI QABDA 'Żball:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Posta tal-Impjegat', @recipients = 'hr@foo.com', @body = 'Ġara żball li ħoloq rekord tal-impjegat ġdid.', @subject = 'Żball ta' Duplikazzjoni tal-ID tal-Impjegat '; END CATCH

F'dan l-eżempju, kwalunkwe żball li jseħħ jiġi rrappurtat kemm lill-utent li jesegwixxi l-kmand kif ukoll lill-indirizz tal-e-mail hr@foo.com. L-iżball li jintwera lill-utent jidher hawn taħt:

Żball: Vjolazzjoni tar-restrizzjoni PRIMARY KEY 'PK_employee_id'. Ma tistax tiddaħħal ċavetta duplikata fl-oġġett "dbo.employees". Mail fil-kju.

Aktar importanti, l-eżekuzzjoni ta 'l-applikazzjoni tkompli b'mod normali, u tippermetti lill-programmatur li jimmaniġġja l-iżball b'mod grazzjuż. L-użu tad-dikjarazzjoni TRY ... CATCH huwa mod eleganti biex b'mod proattiv jikxef u jimmaniġġja l-iżbalji li jseħħu fl-applikazzjonijiet tad-database SQL Server.

Tagħlim Aktar

Jekk trid titgħallem aktar dwar il-Lingwa ta 'Mistoqsija Strutturata, aqra l- Introduzzjoni għall-SQL .