Paŝo de paŝo post paŝo por uzi TRY ... KORKTAJ Ŝovi SQL-servilajn Erarojn

Identigu erarojn sen interrompi ekzekuton

La TRY ... CATCH-deklaro en Transact- SQL detektas kaj manigas erarojn en viaj datumbazoj. Ĉi tiu deklaro estas la angulo de SQL Server erara uzado kaj estas grava parto de evoluigado de solidaj datumbazoj. TRY ... CATCH aplikas al SQL-Server ekde 2008, Azure SQL-datenbazo, Azure SQL Data Warehouse kaj Paralela Datenstarejo.

Enkondukante TRY..CATCH

TRY ... CATCH funkcias permesante al vi specifi du Transakt-SQL-deklarojn: unu, kiun vi volas "provi" kaj alia uzi por "kapti" ajnajn erarojn, kiuj povus ŝpruci. Kiam SQL-servilo renkontas TRY ... CATCH-deklaron, ĝi tuj ekzekutas la deklaron inkluzivitan en la TRY-klaŭzo. Se la TRY-deklaro ekzekutas sukcese, SQL-servilo simple moviĝas. Tamen, se la TRY-deklaro generas eraron, SQL-servilo ekzekutas la deklaron de CATCH por gracii la eraron.

La baza sintakso prenas ĉi tiun formon:

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

TRY ... CATCH Ekzemplo

Estas pli facila kompreni la uzon de ĉi tiu aserto per la uzo de ekzemplo. Imagu, ke vi estas administranto de datumbazo de homaj rimedoj, kiu enhavas tablon nomatan "Oficistoj," kiuj enhavas informojn pri ĉiu de la dungitoj en via organizaĵo. Tiu tablo uzas entjera dungitan numeron kiel la ĉefa ŝlosilo . Vi povus provi uzi la deklaron sube por enmeti novan oficiston en vian datumbazon:

INSERT INTO dungitoj (id, unua nomo, lasta nomo, etendo) VALUOJ (12497, 'Mike', 'Chapple', 4201)

Sub normalaj cirkonstancoj, ĉi tiu deklaro aldonus vicon al la tablo de Oficistoj. Tamen, se oficisto kun ID 12497 jam ekzistas en la datumbazo, enmeti la vicon malobservos la ĉefan ŝlosilon kaj rezultos la sekvan eraron:

Msg 2627, Nivelo 14, Ŝtato 1, Linio 1 Seksperfortado de PRIMARY KEY-limigo 'PK_employee_id'. Ne povas enmeti duoblan klavon en objekto 'dbo.employees'. La deklaro estis eksigita.

Dum ĉi tiu eraro provizas al vi la informojn, kiujn vi bezonas por solvi problemojn, ekzistas du aferoj kun ĝi. Unue, la mesaĝo estas kripta. Ĝi inkluzivas erarojn kodojn, liniojn kaj aliajn informojn neincepteblaj al la averaĝa uzanto. Due, kaj pli grave, ĝi kaŭzas la deklaron malhelpi kaj povus kaŭzi aplikaĵon frakasita.

La alternativo estas envolvi la deklaron en TRY ... CATCH-deklaro, kiel montriĝas sube:

BEKKRIBIĜI INSERT ENTO dungitoj (id, unua nomo, lasta nomo, etendo) VALUES (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN CATCH PRINT 'Eraro:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Oficiala Poŝto', @recipients = 'hr@foo.com', @body = 'Eraro okazis kreante novan dungitan rekordon.', @subject = 'Dungita Duplika Eraro de Dungitaro'; END CATCH

En ĉi tiu ekzemplo, iuj eraroj okazantaj estas raportitaj al la uzanto, kiu plenumas la komandon kaj la retpoŝtadreson hr@foo.com. La eraro montrita al la uzanto aperas sube:

Eraro: Seksperfortado de PRIMARY KEY-limigo 'PK_employee_id'. Ne povas enmeti duoblan klavon en objekto 'dbo.employees'. Poŝto vosto.

Plej grave, la aplika ekzekuto daŭras kutime, permesante al la programisto manipuli gracie la eraron. Uzo de la TRY ... CATCH-aserto estas eleganta maniero por detekti kaj manipuli erarojn, kiuj okazas en SQL-servilaj datumbazoj.

Lerni Pli

Se vi volas lerni pli pri la Strukturita Query-Lingvo, legu Enkondukon al SQL .