SQL 异常处理 Begin try end try begin catch end catch
2011-07-07 13:26
531 查看
总结了一下错误捕捉方法: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
这是在数据库转换的时候用的的异常处理,
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
相关文章推荐
- SQL 异常处理 Begin try end try begin catch end catch
- SQL 异常处理 Begin try end try begin catch end catch--转
- sql server try...catch使用 异常处理 不错的SQL错误处理
- 异常处理try...catch(sql 2005版本以上可以使用)
- C++处理异常技巧-try,catch,throw,finally
- 异常概念和处理机制,try-catch-finally,throw和throws,自定义异常
- JAVA基础再回首(十九)——异常的概述、Try…Catch、多异常处理、Throws、throw、finally、自定义异常及异常的注意事项
- 有关try..catch..finally处理异常的总结
- java 进阶(1)--异常处理:try……catch,Throw处理异常和finally的用法
- 【面试加分项】java异常处理之try_catch_finally
- C++处理异常技巧-try,catch,throw,finally
- JAVA异常处理try{}catch{}
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
- 无需写try/catch,也能正常处理异常 (转)
- C++中异常处理的语法 try catch throw
- C++异常处理: try,catch,throw,finally的用法
- 关于java异常处理的几个关键字 try catch/throw/throws
- 异常处理try.....catch
- c#描述异常处理语句try、catch、finally执行时的相互关系
- C++处理异常技巧-try,catch,throw,finally