Här är en del av en mall för lagrad procedur som jag använder:
/* CREATE PROCEDURE... */
DECLARE
@ErrorMessage varchar(2000)
,@ErrorSeverity tinyint
,@ErrorState tinyint
/* Additional code */
BEGIN TRY
/* Your code here */
END TRY
BEGIN CATCH
SET @ErrorMessage = ERROR_MESSAGE()
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorState = ERROR_STATE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
BREAK
END CATCH
/* Further cleanup code */
Try/Catch-block kan vara knepigt men är mycket mer grundliga än @@error. Ännu viktigare är att du kan använda de olika error_xxx()-funktionerna i dem. Här lagrar jag rätt felmeddelande i variabeln @ErrorMessage, tillsammans med tillräckligt med annan data för att återuppta felet. Härifrån finns valfritt antal alternativ tillgängliga; du kan göra @ErrorMessage till en utdatavariabel, testa och hantera specifika fel, eller bygga dina egna felmeddelanden (eller justera de befintliga för att bli tydligare - du kan bli irriterad av att ta reda på hur ofta du vill göra det). Andra alternativ kommer att presentera dem.
Något att hålla utkik efter:i vissa situationer kommer SQL att skicka två felmeddelanden rygg mot rygg... och error_message()
kommer bara att fånga den sista, som vanligtvis säger något i stil med "försök att skapa objekt misslyckades", med det verkliga felet som anges i det första felmeddelandet. Det är här att bygga ditt eget felmeddelande kommer in.