'N stap-vir-stap-gids om gebruik te maak van TRY ... CATCH om SQL Server-foute te hanteer

Identifiseer foute sonder om die uitvoering te onderbreek

Die TRY ... CATCH-stelling in Transact- SQL ontdek en hanteer fouttoestande in u databasis-toepassings. Hierdie stelling is die hoeksteen van SQL Server-fouthantering en is 'n belangrike deel van die ontwikkeling van robuuste databasis-toepassings. TRY ... CATCH is van toepassing op SQL Server vanaf 2008, Azure SQL Database, Azure SQL Data Warehouse en Parallel Data Warehouse.

Stel TRY..CATCH bekend

TRY ... CATCH werk deur u twee Transact-SQL-stellings te kan spesifiseer: een wat u wil "probeer" en 'n ander om enige foute wat mag voorkom, te "vang". Wanneer SQL Server 'n TRY ... CATCH-stelling ervaar, voer dit onmiddellik die stelling in die TRY-klousule uit. As die TRY-stelling suksesvol uitgevoer word, beweeg SQL Server eenvoudig aan. As die TRY-stelling egter 'n fout oplewer, voer SQL Server die CATCH-stelling uit om die fout met grasie te verwerk.

Die basiese sintaksis neem hierdie vorm:

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

Probeer ... Voorbeeld

Dit is maklik om die gebruik van hierdie stelling te verstaan ​​deur gebruik te maak van 'n voorbeeld. Stel jou voor dat jy die administrateur van 'n databank vir mensehulpbronne is wat 'n tabel met die naam "Werknemers" bevat, wat inligting bevat oor elkeen van die werknemers in jou organisasie. Daardie tabel gebruik 'n heelgetal werknemer ID nommer as die primêre sleutel . U kan probeer om die onderstaande stelling te gebruik om 'n nuwe werknemer in u databasis in te voeg:

INSERT AAN werknemers (id, eerste naam, laaste naam, uitbreiding) WAARDES (12497, 'Mike', 'Chapple', 4201)

Onder normale omstandighede sal hierdie stelling 'n ry by die Werknemers-tabel voeg. As daar egter 'n werknemer met ID 12497 in die databasis bestaan, sal die invoeging van die ry die primêre sleutelbeperking oortree en die volgende fout inhou:

Msg 2627, Vlak 14, Staat 1, Lyn 1 Oortreding van PRIMÊRE SLEUTEL beperking 'PK_employee_id'. Kan nie duplikaat sleutel in voorwerp 'dbo.employees' voeg nie. Die verklaring is beëindig.

Terwyl hierdie fout die inligting bevat wat u nodig het om die probleem op te los, is daar twee probleme daarmee. Eerstens, die boodskap is kripties. Dit sluit foutkodes, reëlnommers en ander inligting in wat nie vir die gemiddelde gebruiker onverstaanbaar is nie. Tweedens, en belangriker, veroorsaak dit dat die stelling afskakel en 'n aansoekkras kan veroorsaak.

Die alternatief is om die stelling in 'n TRY ... CATCH-stelling te wikkel, soos hieronder getoon:

BEGIN PRY INSERT IN werknemers (ID, eerste naam, laaste naam, uitbreiding) WAARDES (12497, 'Mike', 'Chapple', 4201) EINDE TRY BEGIN FILM PRINT 'Fout:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Werknemer Mail', @recipients = 'hr@foo.com', @body = 'Daar is 'n fout opgetree om 'n nuwe werknemer rekord te skep.', @subject = 'Werknemer ID duplisering fout'; EINDVIND

In hierdie voorbeeld word enige foute wat voorkom, gerapporteer aan beide die gebruiker wat die opdrag uitvoer en die e-posadres hr@foo.com. Die fout wat aan die gebruiker gewys word, verskyn hieronder:

Fout: Oortreding van PRIMARY KEY-beperking 'PK_employee_id'. Kan nie duplikaat sleutel in voorwerp 'dbo.employees' voeg nie. Poswachtrij.

Belangriker nog, die uitvoering van die toepassing word normaalweg voortgesit, sodat die programmeerder die fout met grasie kan hanteer. Die gebruik van die TRY ... CATCH-stelling is 'n elegante manier om proaktief op te spoor en te hanteer foute wat voorkom in SQL Server databasis toepassings.

Leer meer

As jy meer wil weet oor die gestruktureerde navraagtaal, lees Inleiding tot SQL .