总结了一下错误捕捉方法:try catch ,@@error,  raiserror

这是在数据库转换的时候用的的异常处理,

Begin Try
Insert into SDT.dbo.DYEmpLostTM(LogDate,ProdGroup,ShiftCode,EmployeeNo,MONo,
OpNo,OTFlag,LostTypeID,OffStdTime,EmployeeGroup,CMFlag)
values(@LogDate,@ProdGroup,@ShiftCode,@EmployeeNo,@MONo,@OpNo,@OTFlag,
@LostTypeID,@OffStdTime,@EmployeeGroup,@CMFlag);

END try   

BEGIN CATCH
DECLARE @Error int
SET @Error = Error_Number()
if @Error = 2627   
    Insert into Migration.dbo.DYEmpLostTMError(LogDate,ProdGroup,ShiftCode,EmployeeNo,MONo,
    OpNo,OTFlag,LostTypeID,OffStdTime,EmployeeGroup,CMFlag,ErrorDesc)
    values(@LogDate,@ProdGroup,@ShiftCode,@EmployeeNo,@MONo,@OpNo,@OTFlag,
    @LostTypeID,@OffStdTime,@EmployeeGroup,@CMFlag,Error_Message() );
END CATCH

 

错误代码2627:表示
违反了 %ls 约束 '%.*ls'。不能在对象 '%.*ls' 中插入重复键。

每个数据库引擎错误都包含以下属性:

  错误代码,消息字符串,严重性,状态,过程名称,行号.

ERROR_NUMBER() :返回错误号

ERROR_MESSAGE() :返回错误信息

ERROR_LINE()        :返回错误所在的行.

ERROR_PROCEDURE() :返回出现错误的存储过程或触发器的名称。如果在存储过程或触发器中未出现错误,该函数返回 NULL

ERROR_STATE()     : 返回状态

ERROR_SEVERITY() : 返回严重性

------------------------------------------------------------------------------------------

 

 @@rowcount  返回受上一个语句影响的行数,如果返回的行大于20亿行 的话,用rowcount_big

 

位于 SELECT 语句之后时,该函数返回由 SELECT 语句返回的行数。

位于 INSERT、UPDATE 或 DELETE 语句之后时,该函数返回受数据修改语句影响的行数。

位于 IF 这类不返回行的语句之后时,该函数返回 0。

---------------------------------------------------------------------------

如果在一个语句之后,同时使用@@rowcount ,和@@error的话,必须把这两个放入一个语句中

update film set filname='aa'
go
print @@error

go
print @@rowcount

运行这个语句返回的结果是:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'filname'.

207
0
而运行

update film set filname='aa'
go
print @@rowcount

go
print @@error

返回的结果是:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'filname'.

0
0

从这两个实例看出:如果运行语句之后想查看是否成功,后面必须紧跟@@error .不能有其他语句:

 

      update film set filname='aa'
      go
DECLARE @ERROR INT;
      DECLARE @ROWCOUNT INT;

      SELECT @ERROR=@@ERROR,@ROWCOUNT=@@ROWCOUNT
     
      PRINT @ROWCOUNT
      PRINT @ERROR

--------------------------------------------------------------------------------

TRY...CATCH 块不处理导致数据库引擎 终止连接的严重性为 20 或更高的错误。但是,只要连接不终止,TRY...CATCH 就会处理严重性为 20 或更高的错误。

 

      严重性为 10 或更低的错误被视为警告或信息性消息,TRY...CATCH 块不处理此类错误.

 

--------------------------------------------------------Raiserror 异常

BEGIN CATCH
SET @Error = Error_Number()
if @Error <> 2627   
    Raiserror('Unexpected error: "%i"',16,1,@Error) WITH SetError
end catch

 

分类:

技术点:

相关文章: