sql >> Database >  >> RDS >> Sqlserver

SQL Server RAISERROR-instructie met eenvoudige voorbeelden

De SQL RAISERROR-instructie wordt gebruikt om een ​​aangepast bericht naar de clienttoepassing te verzenden. Het kan ook worden gebruikt om de applicatie te debuggen en is van toepassing op het foutafhandelingsmechanisme.

SQL RAISERROR-instructie syntaxis en parameters

De syntaxis van de SQL RAISERROR-instructie is als volgt:

RAISERROR ( { message_text | message_id | @local_variable }  
    { ,severity ,state }  
    [ ,argument [ ,...n ] ]   
    [ WITH option [ ,...n ] ];

Hieronder ziet u de uitleg van de RAISERROR-sleutelwoordparameters die u kunt specificeren:

message_text – het bericht dat u bij een fout wilt weergeven. Opmerking: We kunnen aangepaste berichten toevoegen om de foutinformatie weer te geven. Zie het uitgelegd in het tweede deel van het artikel.

message_id – de id van de foutmelding. Als u het door de gebruiker gedefinieerde bericht wilt weergeven, moet u dit definiëren. Bekijk de lijst met message_ids in de sys.messages DMV .

Zoekopdracht

select * from sys.messages

De uitvoer:

ernst – de ernst van een fout. Het datatype van de ernst variabele is klein , en de waarden liggen tussen 0 en 25. De geldige waarden voor de ernst van de fout zijn als volgt:

  • 0-10 – informatieve berichten
  • 11-18 – fouten
  • 19-25 – fatale fouten

Opmerking : Als u een door de gebruiker gedefinieerd bericht maakt, wordt de ernst die is opgegeven in het door de gebruiker gedefinieerde bericht overschreven door de ernst die is opgegeven in de RAISERROR-instructie.

staat – het unieke identificatienummer dat u kunt gebruiken om de codesectie te identificeren die de fout veroorzaakt. Het datatype van de statusparameter is klein , en de waarden liggen tussen 0 en 255.

Laten we nu verder gaan met praktische voorbeelden.

Voorbeeld 1:Gebruik SQL Server RAISERROR-instructie om de uitvoer af te drukken

In dit voorbeeld kunt u zien hoe we het fout- of informatiebericht kunnen weergeven met behulp van de RAISERROR-instructie.

Stel dat u het bericht wilt weergeven nadat u records in de tabel hebt ingevoegd. We kunnen SQL PRINT- of RAISERROR-instructies gebruiken. Hieronder volgt de code:

SET nocount ON 

INSERT INTO tblpatients 
            (patient_id, 
             patient_name, 
             address, 
             city) 
VALUES     ('OPD00006', 
            'Nimesh Upadhyay', 
            'AB-14, Ratnedeep Flats', 
            'Mehsana') 

RAISERROR ( 'Patient detail added successfully',1,1) 

De uitvoer:

Zoals je kunt zien in de bovenstaande afbeelding, is de bericht-ID 50000 omdat het een door de gebruiker gedefinieerd bericht is.

Voorbeeld 2:SQL RAISERROR-instructie met de dynamische berichttekst

Kijk nu hoe we de dynamische berichttekst voor de SQL RAISERROR-instructie kunnen maken.

Stel dat we de ID van de patiënt in het bericht willen afdrukken. Ik heb de lokale variabele gedefinieerd met de naam @PatientID , die de patient_id . bevat . Om de waarde van de @patientID weer te geven variabele in de berichttekst, kunnen we de volgende code gebruiken:

DECLARE @PatientID VARCHAR(15) 
DECLARE @message NVARCHAR(max) 

SET @PatientID='OPD00007' 
SET @message ='Patient detail added successfully. The OPDID is %s' 

INSERT INTO tblpatients 
            (patient_id, 
             patient_name, 
             address, 
             city) 
VALUES     ('' + @PatientID + '', 
            'Nimesh Upadhyay', 
            'AB-14, Ratnedeep Flats', 
            'Mehsana') 

RAISERROR ( @message,1,1,@patientID) 

De uitvoer:

Om de string in de RAISERROR-instructie weer te geven, moeten we de C-stijl print-instructies gebruiken.

Zoals je kunt zien in de bovenstaande afbeelding, naar toon de parameter in de berichttekst, ik heb de optie %s gebruikt dat de tekenreekswaarde van de parameter weergeeft . Als u de integer-parameter wilt weergeven , kunt u de %d optie . gebruiken .

Gebruik SQL RAISERROR in TRY..CATCH Block

In dit voorbeeld voegen we SQL RAISERROR toe aan het TRY-blok. Wanneer we deze code uitvoeren, wordt deze uitgevoerd naar het bijbehorende CATCH-blok. In het CATCH-blok zullen we de details van de aangeroepen fout weergeven.

BEGIN try 
    RAISERROR ('Error invoked in the TRY code block.',16,1 ); 
END try 

BEGIN catch 
    DECLARE @ErrorMsg NVARCHAR(4000); 
    DECLARE @ErrSeverity INT; 
    DECLARE @ErrState INT; 

    SELECT @ErrorMsg = Error_message(), 
           @ErrSeverity = Error_severity(), 
           @ErrState = Error_state(); 

    RAISERROR (@ErrorMsg,
               @ErrSeverity,
               @ErrState 
    ); 
END catch;

Daarom hebben we de RAISERROR-instructie toegevoegd met de ernst tussen 11 -19. Het zorgt ervoor dat het CATCH-blok wordt uitgevoerd.

Binnen het CATCH-blok tonen we de informatie van de oorspronkelijke fout met behulp van de RAISERROR-instructie.

De uitvoer:

Zoals je kunt zien, heeft de code de informatie over de oorspronkelijke fout geretourneerd.

Laten we nu eens kijken hoe we een aangepast bericht kunnen toevoegen met behulp van de sp_addmessage opgeslagen procedure.

sp_addmessage Opgeslagen procedure

We kunnen het aangepaste bericht toevoegen door de sp_addmessages . uit te voeren opgeslagen procedure. De syntaxis is:

EXEC Sp_addmessage 
  @msgnum= 70001, 
  @severity=16, 
  @msgtext='Please enter the numeric value', 
  @lang=NULL, 
  @with_log='TRUE', 
  @replace='Replace'; 

@msgnum: Geef het berichtnummer op. Het gegevenstype van de parameter is geheel getal. Het is een bericht-ID voor het door de gebruiker gedefinieerde bericht.

@severity: Geef het ernstniveau van de fout op. De geldige waarden liggen tussen 1 en 25. Het gegevenstype van de parameter is smallint.

@messagetext: Geef het bericht op dat u wilt weergeven. Het gegevenstype van de parameter is nvarchar(255), en de standaardwaarde is NULL.

@lang: Geef de taal op die u wilt gebruiken om het foutbericht weer te geven. De standaardwaarde is NULL.

@with_log: Deze parameter wordt gebruikt om het bericht naar de gebeurtenisviewer te schrijven. De geldige waarden zijn TRUE en FALSE. Als u TRUE opgeeft, wordt het foutbericht naar de gebeurtenisviewer van Windows geschreven. Als u FALSE kiest, wordt de fout niet naar het foutenlogboek van Windows geschreven.

@replace: Als u de bestaande foutmelding wilt vervangen door een door de gebruiker gedefinieerd bericht en ernstniveau, kunt u de vervanging specificeren in de opgeslagen procedure.

Stel dat u een foutbericht wilt maken dat een ongeldige kwaliteit . retourneert fout. In de INSERT-instructie, de waarde van de product_quantity ligt tussen 20 en 100. Het bericht moet als een fout worden behandeld en de ernst is 16.

Voer de volgende query uit om het bericht te maken:

USE master;
go 
EXEC Sp_addmessage 
  70001, 
  16, 
  N'Product Quantity must be between 20 and 100.'; 
go

Nadat het bericht is toegevoegd, voert u de onderstaande zoekopdracht uit om het te bekijken:

USE master 
go 
SELECT * FROM   sys.messages WHERE  message_id = 70001 

De uitvoer:

Gebruikergedefinieerde foutmeldingen gebruiken

Zoals ik eerder al zei, moeten we message_id . gebruiken in de RAISERROR-instructie voor de door de gebruiker gedefinieerde berichten.

We hebben een bericht gemaakt met de ID van 70001. Het RAISERROR-statement zou als volgt moeten zijn:

USE master 
go 
RAISERROR (70001,16,1 ); 
go 

De uitvoer:

De instructie RAISERROR heeft het door de gebruiker gedefinieerde bericht geretourneerd.

sp_dropmessage Opgeslagen procedure

Het sp_dropmessage opgeslagen procedure wordt gebruikt om door de gebruiker gedefinieerde berichten te verwijderen. De syntaxis is als volgt:

EXEC Sp_dropmessage @msgnum

In de syntaxis, @msgnum specificeert de ID van het bericht dat u wilt verwijderen.

Nu willen we het bericht verwijderen waarvan de ID 70001 is . De vraag is als volgt:

EXEC Sp_dropmessage 70001 

Nadat het bericht is verwijderd, voert u de volgende query uit om het te bekijken:

USE master 
go 
SELECT * FROM   sys.messages WHERE  message_id = 70001 

De uitvoer:

Zoals je kunt zien, is het bericht verwijderd.

Samenvatting

Daarom hebben we de RAISERROR-instructie, de parameters ervan onderzocht en het gebruik ervan in praktische voorbeelden gedemonstreerd. We hebben ook het gebruik van de sp_addmessage . verduidelijkt en sp_dropmessage opgeslagen procedures. Ik hoop dat dit artikel u enkele nuttige inzichten heeft opgeleverd voor uw werkdoelen.

We zijn altijd blij om uw opmerkingen te horen en misschien aanvullende praktische tips als u deze wilt delen.


  1. Hoe RAND() deterministisch te maken in SQL Server

  2. Hoe een opgeslagen procedure in SQL Server te coderen

  3. MSDTC op server 'server is niet beschikbaar'

  4. Oracle-servicenamen gebruiken met SQLAlchemy