SQL 异常处理 Begin try end try begin catch end catch--转
SQL 异常处理 Begin try end try begin catch end catch
总结了一下错误捕捉方法: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
http://blog.csdn.net/wobuwei/archive/2009/08/18/4459019.aspx