Table of Contents
This is a pre-extension article of one of my recently published articles, Error Handling in SQL Server 2005. There were a few gaps that I didn't mention about raise error. So, I linked it to that article, so that readers can have a better view on Error handling. Here I have explained only those things which we use generally while working in SQL Server. If you want to know details, please have a look into Further Study and Reference Section. Please give your valuable suggestions and feedback.
SQL Server has its own error handling mechanism, where @@Error
is used to trap the errors and we can get the Error Message for that error. RAISERROR
allows developers to produce our own error message. Using RAISERROR
, we can throw our own error message while running our Query or Stored procedure. RAISERROR
is used to return messages back to applications using the same format as a system error or warning message generated by the SQL Server Database Engine
. We can also set our own severity for each and every individual message.
To conclude the summary:
- It allows developers to generate their own messages
- It returns the same message format that is generated by SQL Server Database Engine
- We can set our own level of Severity for messages
- It can be associated with Query and stored procedure
Below is the general syntax for RAISERROR
:
RAISERROR ( { Message ID | Message Text}
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
Let's divide the block for better understanding.
RAISERROR ( { Message ID | Message Text}
Generally we can use a specific message id (msg_id
) or provide an error message string.
Is a user-defined error message number stored in the sys.messages
catalog view. Error numbers for user-defined error messages should be greater than 50000
. By default, RAISERROR
raises an error message with an error number of 50000
.
We can add error number using sp_addmessge
in the following way:
exec sp_addmessage @msgnum=50009,@severity=1,@msgtext='Custom Error Message'
Now, if you want to check what the original location that messages are stored in, you need to run the following query:
select * from sys.messages
Have a look at the below images, where I have explained the step by step procedures. Right now, forget about @Severity
parameter and other optional parameter. I have explained them later.
This is how the data is stored inside SQL Server and returned by the SQL Server Database Engine when we call like this...
RAISERROR ( 50009,1,1)
... which will show us the below output:
Custom Error Message
Msg 50009, Level 1, State 1
Now, I guess you can co-relate things. Let's move to message text parameter.
This is the message description, that I have already explained in the last example and you are now also aware where it is stored physically. Error message has certain limitations:
- The error message can have a maximum of
2,047
characters - If the message has more than
2,047 characters
, then will show only 2,044
characters with an ellipsis to indicate that the message has been truncated
As I have already mentioned, if we did not specify any message number, RAISERROR
will use 50000
ID by default. This is the only reason we need to specify the error message ID more than 50000. If we add any message with ID 50000, it will throw the following error:
User-defined error messages must have an ID greater than 50000.
There are certain parameters used with message text. For that, I will recommend you read the article that I have mentioned in the Further Study section.
Now, just have a look at the other two parameters of RAISERROR
:
RAISERROR ( { Message ID| Message Text}
{ ,severity ,state }
These stand for set Severity and state for the message. These two are numeric types and relate to how severe the message is.
We have to mention severity, while adding the message using sp_addmessage.
Range of Severity level is 0-25
. But for user defined message, we have to set it up to 0-19. 20-25 can only be set by the administrator. Severity levels from 20 through 25
are considered fatal.
For any message related to RAISERROR
, we have to specify the state also. The default State value is 1. The range of state is from 1 to 127
. But for most implementations, we use 1. We can use it to indicate which error was thrown by providing a different state for each RAISERROR
function in our stored procedure. This is a required parameter.
Finally, there are options that we can set, these are the WITH
options.
It will place the error in windows Error log. We have to mention this parameter while adding the message using sp_addmessage
.
exec sp_addmessage @msgnum=50002,@severity=1,_
@msgtext='This Error Message Will Store into EVENT VIEWER',@with_log='true'
Now, if we want to test the result, just execute this command RAISERROR ( 50002,1,1)
, we can get an entry in EventViewer
.
Send the error directly to client.
It will replace the error ID with 5000.
I have already explained it previously. Here I am going to give you a brief overall syntax and the arguments it needs.
sp_addmessage [ @msgnum= ] msg_id, [ @severity= ] severity ,
[ @msgtext = ' ] 'message'
[, [ @lang = ] 'Language' ]
[, [ @with_log = ] 'log' ]
[, [ @replace = ] 'replace' ]
Here is the general overview of those parameters.
Indicates the number of the message. It should be greater than 50000.
We used 1 in most cases. General range is 1 to 25. I have already covered the details.
Message text, maximum characters limit is 2,047. More than that will be truncated.
Used if you want to specify any language.
As I have already shown in example, Set 'TRUE
' to log the error in EventViewer
.
If the same message number already exists, but you want to replace the string for that ID, you have to use this parameter.
Now have a look into a simple example where we can check each and every point that has been discussed above.
To add an error message, we have to use sp_addmessgae
stored procedure. This message will store inside sys.messages
. The error number should be greater than 5000.
exec sp_addmessage @msgnum=50010,@severity=1,_
@msgtext='User-Defined Message with ID 50010'
This is not mandatory, you can check the original location and how it is stored by just running the following query:
select * from sys.messages
This will give you the following output:
message_id language_id severity is_event_logged text
----------- ----------- -------- --------------- ----------------------------
50010 1033 1 1 User-Defined Message with ID 50010
Now we can retrieve the message using RAISERROR
:
RAISERROR ( 50010,1,1)
This will give the following output:
User-Defined Message with ID 50010
Msg 50010, Level 1, State 1
If we need to store the message inside Event Viewer, we have to use @with_log
parameter:
sp_addmessage @msgnum=50002,@severity=1,_
@msgtext='This Error Message Will Store into EVENT VIEWER',@with_log='true'
I have already covered that part how it is stored inside Event Viewer.
If we have already set the message for some error id and we want to replace the message, it will throw an error as follows:
You must specify 'REPLACE' to overwrite an existing message.
So, for replacing message we have to use
@replace parameter with sp_addmessge Stored procedure.
Here is the syntax:
exec sp_addmessage @msgnum=50010,@severity=1,_
@msgtext='User-Defined Message with ID 50010-Replaced Message',_
@with_log='true', @replace='replace'
This will replace the message for the id 50010.
You can try it using run RAISERROR again.
The below code is a simple example where I have shown how we can use RAISERROR inside TRY-CATCH Block:
BEGIN TRY
DECLARE @Intval int;
SET @Intval = 1/0;
END TRY
BEGIN CATCH
RAISERROR (50009, 11, 1);
END CATCH;
- 15th August 2009: Initial version posted