Technical Article

Error handling inside stored procedure

,

Following script gives an example how to handle errors inside stored procedure with returning information about type of error occured

create proc _Err_Sp
	@Emp_Code char(5),
	@Name_Type char(1)= 'O',   ----'O'- organization; 'P' - person
	@Client_Name varchar(120),  -- for person "Last Name"
	@First_Name varchar(20) = '',
	@Middle_Name varchar(20) = '',
	@Currency char(3) ='USD'

as

/*
This procedure created entry in the Name table for client with indication if it's person or organization.
Passing parameters include Employee code, insert info,type 
Validation have to be done on employee code and type
*/
declare	@Emp_ID int,
	@Full_Client_Name char(120),
	@Client_Name_Rept char(40),
	@ErrNum int, 
	@RowCount int,
	@myerror varchar (50),
	@err_emp int ,
	@err_type int

	set @err_emp =30001
	set @err_type = 30002
	set @MyError =""

set nocount on	

IF @@TRANCOUNT=0
	BEGIN TRAN

	select @Emp_ID =  EMP_ID from tbl_PERSNL where EMPLOYEE_CODE = @Emp_Code
	select @RowCount = @@ROWCOUNT, @ErrNum = @@ERROR
	if   @ErrNum <> 0 GOTO myerror

	IF @RowCount = 0 
		begin
			set @myerror = "Employee Code is Invalid "
			set @ErrNum =@err_emp
			GOTO myerror
		end

	if @Name_Type ='P' 
	   BEGIN
		select @Full_Client_Name =rtrim( rtrim(@Client_Name)+ ','+rtrim(coalesce(@First_Name,''))+ ' ' +rtrim(coalesce(@Middle_Name,'')))
		select 	@Client_Name_Rept = left(@Full_Client_Name,40)

		insert into TBL_NAME
			(MAIN_NAME,LAST_NAME,FIRST_NAME,MIDDLE_NAME,
			LANGUAGE_CODE,CURRENCY)
		values ( @Full_Client_Name,@Client_Name,@First_Name,@Middle_Name,'EN',@Currency)
		set @ErrNum = @@ERROR
		if   @ErrNum <> 0 GOTO myerror

	   END	
	else if @Name_Type ='O'
	   BEGIN
		select 	@Client_Name_Rept = left(@Client_Name,40)
		insert into TBL_NAME
			(MAIN_NAME,NAME_REPT,LANGUAGE_CODE,CURRENCY)
		values (@Client_Name,@Client_Name_Rept,'EN',@Currency)
		set @ErrNum = @@ERROR
		if   @ErrNum <> 0 GOTO myerror

	   END
	ELSE
	   BEGIN
		set @myerror = "Name Type is Invalid "
		set @ErrNum =@err_type
		GOTO myerror
	   END
	
	COMMIT TRAN 

set nocount off
RETURN 0

myerror:
BEGIN

	if @@trancount<>0 
	begin
	 	ROLLBACK TRAN
		select 'Rolling Back Client'
	end
	IF len(ltrim(rtrim(@myerror)))= 0
/* If it's system error */
		SELECT @myerror = (SELECT  description FROM  master..sysmessages WHERE error = @ErrNum)
		
	raiserror @errnum @myerror
	
	set nocount off
	RETURN @ErrNum
END

Rate

3 (2)

You rated this post out of 5. Change rating

Share

Share

Rate

3 (2)

You rated this post out of 5. Change rating