sql >> Database >  >> RDS >> Sqlserver

Wat is SQL Server RAISERROR?

Als er iets misgaat in uw T-SQL, wilt u het probleem snel oplossen met zo min mogelijk speurwerk en hinder voor gebruikers. Door SQL Server gegenereerde foutberichten zijn zeer technisch en moeilijk te begrijpen, waardoor het moeilijk kan zijn om problemen te isoleren en de oplossingstijd kan vertragen. Gelukkig kunnen DBA's SQL Server RAISERROR implementeren als alternatief voor SQL Server-foutmeldingen.

RAISERROR is een SQL Server-foutafhandelingsinstructie die een foutbericht genereert en foutverwerking initieert. RAISERROR kan verwijzen naar een door de gebruiker gedefinieerd bericht dat is opgeslagen in de sys.messages-catalogusweergave of het kan dynamisch een bericht samenstellen. Het bericht wordt geretourneerd als een serverfoutbericht naar de aanroepende toepassing of naar een bijbehorend CATCH-blok van een TRY...CATCH-constructie.

Er zijn verschillende scenario's waarin het gepast is om de RAISERROR-instructie te gebruiken:

  • Problemen met Transact-SQL-code oplossen
  • Berichten retourneren die variabele tekst bevatten
  • Gegevenswaarden onderzoeken
  • Als je de uitvoering nodig hebt om van een TRY-blok naar het bijbehorende CATCH-blok te springen of foutinformatie van het CATCH-blok terug te sturen naar de bellers

Het is belangrijk op te merken dat bij het ontwikkelen van nieuwe toepassingen een THROW-statement nu de voorkeur heeft boven RAISERROR voor foutafhandeling. Maar daarover later meer.

Waarom RAISERROR gebruiken voor SQL Server-foutafhandeling?

Er zijn twee hoofdredenen om RAISERROR te verkiezen boven door SQL Server gegenereerde foutafhandeling:

  1. De RAISERROR-berichten kunnen worden aangepast met betrekking tot het niveau van ernst en status
  2. Ze kunnen worden geschreven in natuurlijke taal die gemakkelijk te begrijpen is

RAISERROR retourneert foutberichten naar de toepassing in dezelfde indeling die wordt gegenereerd door SQL Server Database Engine. Hiermee kunnen ontwikkelaars hun eigen foutmeldingen genereren, zodat iedereen die het bericht leest, kan begrijpen wat het werkelijke probleem is in plaats van te proberen de technische foutmelding van SQL Server te ontcijferen. Ontwikkelaars kunnen ook hun eigen ernstniveau, bericht-ID en status voor foutmeldingen instellen.

RAISERROR gebruiken met de TRY...CATCH Construct

TRY...CATCH is een constructie voor foutafhandeling waarmee u code in de TRY-sectie kunt uitvoeren en fouten in de CATCH-sectie kunt afhandelen. Over het algemeen is TRY...CATCH een effectieve manier om veel T-SQL-fouten te identificeren, maar er zijn enkele uitzonderingen.

Deze tutorial biedt een gedetailleerde uitleg over het gebruik van RAISERROR in combinatie met TRY...CATCH. De auteur gebruikt een voorbeeld dat laat zien hoe de RAISERROR in een TRY-blok moet worden gebruikt om de uitvoering naar het bijbehorende CATCH-blok te laten springen. Binnen het CATCH-blok laat de auteur zien hoe de RAISERROR moet worden gebruikt om de foutinformatie te retourneren die het CATCH-blok heeft aangeroepen. De uitvoer toont de bericht-ID, het ernstniveau en de foutstatus.

RAISERROR vs. THROW Foutafhandelingsverklaringen

RAISERROR is geïntroduceerd in SQL Server 7.0 en is al vele jaren een effectieve manier om T-SQL-fouten af ​​te handelen. Maar als u nieuwe apps ontwikkelt, raadt Microsoft nu aan om THROW-instructies te gebruiken in plaats van RAISERROR.

Terwijl organisaties updaten naar SQL Server 2012 en hoger, wordt RAISERROR uitgefaseerd. In feite kan RAISERROR niet worden gebruikt in de native gecompileerde Stored Procedures van SQL Server 2014. THROW wordt beschouwd als een verbetering ten opzichte van RAISERROR omdat het gemakkelijker te gebruiken is.

In de SQL Server-documentatie van Microsoft worden de verschillen tussen de RAISERROR- en THROW-foutafhandelingsinstructies als volgt opgesplitst:

RAISERROR-instructie

  • Als een msg_id wordt doorgegeven aan RAISERROR, moet de ID worden gedefinieerd in sys.messages.
  • De parameter msg_str kan printf-opmaakstijlen bevatten.

De ernstparameter specificeert de ernst van de uitzondering.

THROW-verklaring

  • De parameter error_number hoeft niet te worden gedefinieerd in sys.messages.
  • De berichtparameter accepteert geen opmaak in printf-stijl.
  • Er is geen ernstparameter. De ernst van de uitzondering is altijd ingesteld op 16.

Hoewel de dagen van RAISERROR geteld zijn, blijft het een haalbare foutafhandelingsoptie op oudere versies van SQL Server. Microsoft dringt er bij gebruikers van nieuwere versies van SQL Server (SQL SERVER 2012 en hoger) op aan om de THROW-instructie te gebruiken in plaats van RAISERROR voor het implementeren van foutafhandeling. Microsoft heeft de beëindiging van RAISERROR nog niet aangekondigd, maar het lijkt waarschijnlijk dat dit eerder vroeger dan later zal gebeuren.


  1. Objecten filteren in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 19

  2. De kosten van uw databasehosting verlagen:DigitalOcean vs. AWS vs. Azure

  3. Hoe een string in PL/SQL te splitsen?

  4. Oracle PL/SQL-verzamelingen - Elementen toevoegen aan een bestaande tabel