sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server RAISERROR-uttalande med enkla exempel

SQL RAISERROR-satsen används för att skicka ett anpassat meddelande till klientapplikationen. Det kan också användas för att felsöka programmet och gäller för felhanteringsmekanismen.

SQL RAISERROR-satssyntax och parametrar

Syntaxen för SQL RAISERROR-satsen är följande:

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

Nedan kan du se förklaringen av RAISERROR-sökordsparametrarna som du kan ange:

meddelande_text – meddelandet du vill visa för ett fel. Obs! Vi kan lägga till anpassade meddelanden för att visa felinformationen. Se det förklarat i artikelns andra avsnitt.

meddelande-id – ID för felmeddelandet. Om du vill visa det användardefinierade meddelandet måste du definiera det. Se listan över meddelande-id i sys.messages DMV .

Fråga

select * from sys.messages

Utgången:

allvarlighetsgrad – hur allvarlig ett fel är. Datatypen för allvarlighetsgrad variabel är smallint , och värdena är mellan 0 och 25. De giltiga värdena för felets allvarlighetsgrad är följande:

  • 0-10 – informationsmeddelanden
  • 11-18 – fel
  • 19-25 – allvarliga fel

Obs : Om du skapar ett användardefinierat meddelande kommer allvarlighetsgraden som anges i det användardefinierade meddelandet att åsidosättas av allvarlighetsgraden som anges i RAISERROR-satsen.

tillstånd – det unika identifikationsnumret som du kan använda för att identifiera koddelen som orsakar felet. Datatypen för tillståndsparametern är smallint , och värden är mellan 0 och 255.

Låt oss nu gå vidare till praktiska exempel.

Exempel 1:Använd SQL Server RAISERROR-satsen för att skriva ut utdata

I det här exemplet kan du se hur vi kan visa fel- eller informationsmeddelandet med RAISERROR-satsen.

Anta att du vill visa meddelandet efter att du har infogat poster i tabellen. Vi kan använda SQL PRINT eller RAISERROR-satser. Följande är koden:

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) 

Utgången:

Som du kan se i bilden ovan är meddelande-ID:t 50000 eftersom det är ett användardefinierat meddelande.

Exempel 2:SQL RAISERROR-sats med den dynamiska meddelandetexten

Se nu hur vi kan skapa den dynamiska meddelandetexten för SQL RAISERROR-satsen.

Anta att vi vill skriva ut patientens ID i meddelandet. Jag har definierat den lokala variabeln som heter @PatientID , som innehåller patient-id . För att visa värdet på @patientID variabel i meddelandetexten kan vi använda följande kod:

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) 

Utgången:

För att visa strängen i RAISERROR-satsen måste vi använda C-style print-satserna.

Som du kan se i bilden ovan, till visa parametern i meddelandetexten, jag har använt alternativet %s som visar strängvärdet för parametern . Om du vill visa heltalsparametern , kan du använda alternativet %d .

Använd SQL RAISERROR i TRY..CATCH Block

I det här exemplet lägger vi till SQL RAISERROR i TRY-blocket. När vi kör den här koden körs den till det associerade CATCH-blocket. I CATCH-blocket kommer vi att visa detaljerna om det anropade felet.

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;

Därför har vi lagt till RAISERROR-satsen med allvarlighetsgraden mellan 11-19. Det orsakar exekvering av CATCH-blocket.

Inom CATCH-blocket visar vi informationen om det ursprungliga felet med RAISERROR-satsen.

Utgången:

Som du kan se har koden returnerat informationen om det ursprungliga felet.

Låt oss nu förstå hur vi kan lägga till ett anpassat meddelande med sp_addmessage lagrad procedur.

sp_addmessage lagrad procedur

Vi kan lägga till det anpassade meddelandet genom att köra sp_addmessages lagrad procedur. Syntaxen är:

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

@msgnum: Ange meddelandenummer. Datatypen för parametern är heltal. Det är ett meddelande-ID för det användardefinierade meddelandet.

@severity: Ange allvarlighetsgraden för felet. De giltiga värdena är mellan 1 och 25. Datatypen för parametern är liten.

@meddelandetext: Ange meddelandet som du vill visa. Datatypen för parametern är nvarchar(255), och standardvärdet är NULL.

@lang: Ange vilket språk du vill använda för att visa felmeddelandet. Standardvärdet är NULL.

@with_log: Denna parameter används för att skriva meddelandet till händelsevisaren. De giltiga värdena är TRUE och FALSE. Om du anger TRUE kommer felmeddelandet att skrivas till Windows händelsevisare. Om du väljer FALSE kommer felet inte att skrivas till Windows fellogg.

@ersätt: Om du vill ersätta det befintliga felmeddelandet med ett användardefinierat meddelande och allvarlighetsgrad kan du ange ersättningen i den lagrade proceduren.

Anta att du vill skapa ett felmeddelande som returnerar en ogiltig kvalitet fel. I INSERT-satsen, värdet av product_quantity är mellan 20 och 100. Meddelandet ska behandlas som ett fel, och svårighetsgraden är 16.

För att skapa meddelandet, kör följande fråga:

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

När meddelandet har lagts till, kör nedanstående fråga för att visa det:

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

Utgången:

Hur man använder användardefinierade felmeddelanden

Som jag nämnde tidigare måste vi använda message_id i RAISERROR-satsen för de användardefinierade meddelandena.

Vi har skapat ett meddelande med ID 70001. RAISERROR-satsen ska vara följande:

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

Utgången:

RAISERROR-satsen har returnerat det användardefinierade meddelandet.

sp_dropmessage lagrad procedur

sp_dropmessage lagrad procedur används för att radera användardefinierade meddelanden. Syntaxen är följande:

EXEC Sp_dropmessage @msgnum

I syntaxen, @msgnum anger ID för meddelandet du vill radera.

Nu vill vi ta bort meddelandet vars ID är 70001 . Frågan är som följer:

EXEC Sp_dropmessage 70001 

När meddelandet har tagits bort, kör följande fråga för att visa det:

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

Utgången:

Som du kan se har meddelandet raderats.

Sammanfattning

Därför har vi utforskat RAISERROR-satsen, dess parametrar och demonstrerat dess användning i praktiska exempel. Vi har också förtydligat användningen av sp_addmessage och sp_dropmessage lagrade procedurer. Hoppas att den här artikeln gav dig några användbara insikter för dina arbetsmål.

Vi är alltid glada att höra dina kommentarer och kanske ytterligare praktiska tips om du vill dela dem.


  1. Använder SQL Server Integration Services (SSIS) för att fylla i QuickBooks-poster

  2. Hur exporterar man all data från tabell till ett insättningsbart sql-format?

  3. Hur kan jag dela upp en lång, enkel SQLiteOpenHelper i flera klasser, en för varje tabell

  4. Kontrollera överlappning av datumintervall i MySQL