During development of any application, one of the most common things
we need to take care of is Exception and Error handling. Similarly we
need to take care of handling error and exception while designing our
database like inside stored procedure. In
SQL Server 2005, there are some beautiful features available using which we can
handle the error.
Generally a developer tries to
handle all kinds of exception from the code itself. But sometimes we need to
handle
the same from the DB site itself. There are some scenarios like, we are
expecting some rows should come when we will execute the store
procedure, but unfortunately SP returns none of them. Below points can
be some possible scenarios where we can use error handling:
- While executing some DML Statement like
INSERT, DELETE, UPDATE we can handle the error for checking proper output
- If transaction fails, then we need to rollback - This can be done by error handling
- While using Cursor in SQL Server
The two most common mechanisms for error handling in
SQL Server 2005 are:
Let's have a look at how we can implement both
@@Error and
Try-
Catch block to
handle the error in
SQL Server 2005.
We can consider
@@ERROR as one of the basic error handling mechanisms in
SQL Server.
@@Error is a
Global Variable in
SQL Server.
This variable automatically populates the error message when a certain
error occurred in any statement. But we have to trace it within just
after the next line where the actual error occurred, otherwise, it will
reset to 0.
General syntax for
@@ERROR is as follows:
Select @@ERROR
int
It returns the Error Number.
I have a table named
StudentDetails with columns,
Roll (int),
Name (varchar) and
Address (varchar). Now I am intentionally trying to insert a
char in
Roll field:
insert into StudentDetails (roll,[Name],Address)
values ('a','Abhijit','India')
This will throw the following Error :
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'a' to data type int.
Check out the Message and number, it is
245. Now, I am executing the
@@Error statement just after this statement and check out the output:
Select @@Error
The output is:

So,
@@Error returns the same error as return by insert command. As I have already said,
@@Error returns the error number for the last Transact-
SQL statement executed, so if we execute any
@@Error statement, we will get output 0.
There are some scenarios where we should use
@@ERROR:
- With
Insert, Delete, Update, Select Into Statement
- While using Cursor in SQL Server (Open, Fetch Cursor)
- While executing any Stored Procedure
This is available from
SQL Server 2005 Onwards. This is generally used where want to trap or catch error for multiple
SQL statements like or a
SQL Block of statement.
TRY...CATCH
blocks are the standard approach to exception handling in modern
programming languages. Use and syntax are likely the same as normal
programming language. Like Exception Handling in Programming Language,
we can use nested
Try-
Catch block in
SQL Server also.
Try block will catch the error and will throw it in the
Catch block.
Catch block then
handles the scenario.
Below is the general syntax for
Try-Catch block:
BEGIN TRY
END TRY
BEGIN CATCH
END CATCH
Whenever there are some errors in
TRY Block, execution will moved to
CATCH block.
As I have already discussed about the
studentDetails table, I am now going to insert one record in the table with
Roll='a'.
BEGIN TRY
INSERT INTO StudentDetails(Roll, [Name])
VALUES('a', 'Abhijit')
END TRY
BEGIN CATCH
SELECT 'There was an error while Inserting records in DB '
END CATCH
As
Roll is an
int type but I am trying to insert a
char type data which will violate the type conversion rule, an error will be thrown. So the execution pointer will jump to
Catch block. And below is the output:
There was an error while Inserting records in DB
Now, to get the details of the error
SQL Server provides the following
System function that we can use inside our
Catch-block for retrieving the details of the error. Please check the below table:
| Function Name |
Description |
ERROR_MESSAGE() |
Returns the complete description of the error message |
ERROR_NUMBER() |
Returns the number of the error |
ERROR_SEVERITY() |
Returns the number of the Severity |
ERROR_STATE() |
Returns the error state number |
ERROR_PROCEDURE() |
Returns the name of the stored procedure where the error occurred |
ERROR_LINE() |
Returns the line number that caused the error |
Here is one simple example of using System Function:
BEGIN TRY
INSERT INTO StudentDetails(Roll, [Name])
VALUES('a', 'Abhijit')
END TRY
BEGIN CATCH
SELECT ' Error Message: ' + ERROR_MESSAGE() as ErrorDescription
END CATCH
I have executed the same code block here but rather than showing
custom message, I am showing the internal Error message by Calling
ERROR_MESSAGE() System function. Below is the output:

Here I am going to explain one real life scenario of using
TRY-CATCH block. One of the common scenarios is using
Transaction. In a
Transaction, we can have multiple operations. If all operations executed successfully, then database will commit otherwise we need to
ROLLBACK.
BEGIN TRY
BEGIN TRANSACTION
DELETE FROM StudentDetails WHERE Roll = '1'
Print 'Delete Record from Student Details Table'
DELETE FROM Library WHERE Roll = 'a'
Print 'Delete Record from Library Table'
COMMIT
Insert into LogDetails(ID,Details) values ('1','Transaction Successful');
END TRY
BEGIN CATCH
Print 'Transaction Failed - Will Rollback'
IF @@TRANCOUNT > 0
ROLLBACK END CATCH
Below is the output:
Delete Record from Student Details Table
Transaction Failed - Will Rollback
No comments:
Post a Comment