Brug TRY / CATCH til at håndtere SQL Server-fejl

TRY / CATCH-sætningen i Transact-SQL registrerer og håndterer fejlforhold i databaseapplikationer. Denne erklæring er hjørnestenen i SQL Serverfejlhåndtering og er en vigtig del af udviklingen af ​​robuste databaseapplikationer.

TRY / CATCH gælder for SQL Server startende med 2008, Azure SQL Database, Azure SQL Data Warehouse og Parallel Data Warehouse.

Introduktion til TRY / CATCH

TRY./CATCH fungerer ved at angive to Transact-SQL-udsagn: en, som du vil "prøve", og en anden til at "fange" eventuelle fejl, der måtte opstå. Når SQL Server støder på en TRY / CATCH-sætning, udfører den straks den sætning, der er inkluderet i TRY-klausulen. Hvis TRY-sætningen udføres med succes, fortsætter SQL Server. Men hvis TRY-sætningen genererer en fejl, udfører SQL Server CATCH-sætningen for at håndtere fejlen yndefuldt.

Den grundlæggende syntaks har denne form:

START PRØV
{sql_statement | sætningsblok}
AFSLUT PRØVNING
BEGIN FANGST
[{sql_statement | statement_block}]
AFSLUT FANGST
[; ]

PRØV / FANG Eksempel

instagram viewer

Overvej en database over menneskelige ressourcer, der indeholder en tabel med navnet medarbejdere, som indeholder oplysninger om hver af de ansatte i en virksomhed. Tabellen bruger et heltal medarbejder-ID-nummer som primærnøgle.

Du kan prøve at bruge udsagnet nedenfor til at indsætte en ny medarbejder i din database:

INSERT INTO-medarbejdere (id, fornavn, efternavn, udvidelse)
VÆRDIER (12497, 'Mike', 'Chapple', 4201)

Under normale omstændigheder tilføjer denne erklæring en række til tabellen medarbejdere. Men hvis en medarbejder med ID 12497 allerede findes i databasen, ville indsættelse af rækken krænke den primære nøglebegrænsning og resultere i følgende fejl:

Msg 2627, niveau 14, tilstand 1, linje 1
Overtrædelse af den primære nøglebegrænsning 'PK_employee_id'. Kan ikke indsætte duplikatnøgle i objektet 'dbo.employees'.
Erklæringen er afsluttet.

Mens denne fejl giver dig de oplysninger, du har brug for til fejlfinding af problemet, er der to problemer med det. For det første er meddelelsen kryptisk. Det inkluderer fejlkoder, linjenumre og andre oplysninger, der er uforståelige for den gennemsnitlige bruger. For det andet og vigtigere, får den erklæringen til at afbryde og kan forårsage et programnedbrud.

Alternativet er at pakke udsagnet i en TRY... CATCH-erklæring, som vist her:

START PRØV
INSERT INTO-medarbejdere (id, fornavn, efternavn, udvidelse)
VÆRDIER (12497, 'Mike', 'Chapple', 4201)
AFSLUT PRØVNING
BEGIN FANGST
UDSKRIV 'FEJL:' + ERROR_MESSAGE ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Medarbejderpost',
@recipients = '[email protected]',
@body = 'Der opstod en fejl under oprettelse af en ny medarbejderpost.',
@subject = 'Medarbejderdatabasefejl';
AFSLUT FANGST

I dette eksempel rapporteres eventuelle opståede fejl til både brugeren, der udfører kommandoen, og e-mail-adressen [email protected]. Fejlen, der vises til brugeren, er:

Fejl: Overtrædelse af PRIMÆRE KEY-begrænsning 'PK_employee_id'. 
Kan ikke indsætte duplikatnøgle i objektet 'dbo.employees'.
Mail i kø.

Applikationsudførelse fortsætter normalt, så programmøren kan håndtere fejlen. Brug af TRY / CATCH-sætningen er en elegant måde at proaktivt opdage og håndtere fejl, der opstår i SQL Server-databaseapplikationer.

Lær mere

For at lære mere om Structured Query Language, se vores artikel Grundlæggende om SQL.