Använda TRY / CATCH för att hantera SQL Server-fel

click fraud protection

TRY / CATCH-satsen i Transact-SQL upptäcker och hanterar felförhållanden i databasapplikationer. Detta uttalande är hörnstenen i SQL Serverfelshantering och är en viktig del av utvecklingen av robusta databasapplikationer.

TRY / CATCH gäller SQL Server från och med 2008, Azure SQL Database, Azure SQL Data Warehouse och Parallel Data Warehouse.

Vi presenterar TRY / CATCH

TRY./CATCH fungerar genom att ange två Transact-SQL-satser: en som du vill "försöka" och en annan för att "fånga" eventuella fel som kan uppstå. När SQL Server stöter på ett TRY / CATCH-uttalande körs det omedelbart uttalandet som ingår i TRY-klausulen. Om TRY-satsen körs framgångsrikt går SQL Server vidare. Men om TRY-satsen genererar ett fel, kör SQL Server CATCH-satsen för att hantera felet graciöst.

Den grundläggande syntaxen har följande form:

Börja prova
{sql_statement | uttalande block}
SLUTPRÖVNING
Börja fånga
[{sql_statement | statement_block}]
SLUTFANGST
[; ]

TRY / CATCH Exempel

Tänk på en personaldatabas som innehåller en tabell med namnet

instagram viewer
anställda, som innehåller information om var och en av de anställda i ett företag. Tabellen använder ett heltal anställds ID-nummer som primärnyckel.

Du kan försöka använda uttalandet nedan för att infoga en ny anställd i din databas:

INSERT INTO anställda (id, förnamn, efternamn, tillägg)
VÄRDEN (12497, 'Mike', 'Chapple', 4201)

Under normala omständigheter skulle detta uttalande lägga till en rad i tabellen Anställda. Men om en anställd med ID 12497 redan finns i databasen, skulle infogning av raden bryta mot den primära nyckelbegränsningen och resultera i följande fel:

Msg 2627, nivå 14, tillstånd 1, rad 1
Överträdelse av PRIMÄR NYCKEL-begränsning 'PK_employee_id'. Det går inte att infoga dubblettnyckel i objektet 'dbo.employees'.
Uttalandet har avslutats.

Även om detta fel ger dig den information du behöver för att felsöka problemet, finns det två problem med det. För det första är meddelandet kryptiskt. Den innehåller felkoder, radnummer och annan information som är obegriplig för den genomsnittliga användaren. För det andra, och ännu viktigare, gör det att uttalandet avbryts och kan orsaka en applikationskrasch.

Alternativet är att sätta in uttalandet i ett TRY... CATCH-uttalande, som visas här:

Börja prova
INSERT INTO anställda (id, förnamn, efternamn, tillägg)
VÄRDEN (12497, 'Mike', 'Chapple', 4201)
SLUTPRÖVNING
Börja fånga
SKRIV UT 'FEL:' + ERROR_MESSAGE ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Anställdes e-post',
@mottagare = '[email protected]',
@body = 'Ett fel uppstod när en ny medarbetarpost skapades.',
@subject = 'Databasfel för anställda';
SLUTFANGST

I det här exemplet rapporteras eventuella fel som uppstår till både användaren som kör kommandot och e-postadressen [email protected]. Felet som visas för användaren är:

Fel: Överträdelse av PRIMÄR KEY-begränsning 'PK_employee_id'. 
Det går inte att infoga dubblettnyckel i objektet 'dbo.employees'.
E-post kö.

Programmets körning fortsätter normalt, så att programmeraren kan hantera felet. Användning av TRY / CATCH-uttalandet är ett elegant sätt att proaktivt upptäcka och hantera fel som uppstår i SQL Server-databasapplikationer.

Lär dig mer

För att lära dig mer om Structured Query Language, kolla in vår artikel Grundläggande för SQL.

instagram story viewer