sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man får sql-fel i lagrad procedur

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.



  1. Kan du övervaka exekveringen av ett SSIS-paket, i BIDS, när det körs på servern?

  2. Accentokänslig sökfråga i MySQL

  3. MSSQL 2008:Hämta senast uppdaterade post per specifikt fält

  4. orakel - sekvenser utan sekvens