mssql sqlserver 存储过程处理错误的方法分享


摘要:
下文主要讲述sql server存储过程中处理错误的方法分享



一、存储过程中使用事务的自动回滚错误

在存储过程中,我们可以通过设置 Set XACT_ABORT ON 属性,并将所有的脚本代码放入一个事务中,
当存储过重产生错误时候,则自动回滚错误信息

   Create Proc  procTest
        @p1 varchar(10)
      as 
       begin
		set NOCOUNT ON;
        set XACT_ABORT ON;
        begin tran
		     [操作表代码] 
        commit tran 
       end
 

注意事项:
1.在存储过程中执行事务,当我们开启了XACT_ABORT属性,执行事务出错,则会自动回滚事务中所有代码,如果在事务中未开启此属性,那么事务中出错将继续执行,并不能达到事务保证操作的完整性。
2.set nocount no 不输出脚本操作影响了多少行

二、事务内进行判断

每执行一条sql脚本时,我们对脚本进行相关判断,是否存在错误信息,如果存在,则立即goto 回滚事务,如下所示:

  create proc procTest
    @p1 varchar(10)
  as 
   begin
      begin tran 

		 update table set filed ='' where keyId =''
		 if @@error <>0  goto err;
 
		 insert into table (field)values('')
	     if @@error <>0  goto err;

	  commit tran
	  return;
	  err:
	  rollback tran
	  return;
   end
 


注意事项:
@@error 只能捕获前一条sql语句是否存在错误


三、存储过程中使用try、catch捕获错误

下文讲述在存储过程中使用 try catch 关键字捕捉错误信息

   create proc procTest
    @p1 varchar(10)
  as 
   begin 
	   Begin  try

         update table set filed ='' where keyId =''
		 insert into table (field)values('')
	   
        End    try
        Begin  Catch
                  SELECT ERROR_NUMBER()  AS  ErrorNumber,
                       ERROR_MESSAGE()  AS  ErrorMessage;
        End    Catch
 
   end
  


注意事项:
ERROR_NUMBER() 返回错误号。
ERROR_SEVERITY() 返回严重性。
ERROR_STATE() 返回错误状态号。
ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。
ERROR_LINE() 返回导致错误的例程中的行号。
ERROR_MESSAGE() 返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。