永久关闭

有了开始就有了好兆头,接受新生活也就是接受挑战。
我是一个普通的程序员,在这里开始写下程序人生的苦辣酸甜。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  2005之前通过读取变量@@ERROR处理错误, 一个错误用一个非零的@@ERROR信息表示,错误编号必须在每天语句后捕捉, 以及从master数据库中的sysmessage表取错误级别.
2005中新增TRYCATCH, 没有FINALLY
:
BEGIN TRY
       DELETE FROM tbl_Currency WHERE CurrencyCode = 'RMB'
END TRY
BEGIN CATCH
    ...
END CATCH

CATCH子句中的函数, 记住只能在CATCH子句中使用
ERROR_NUMBER()        :      错误号
ERROR_SEVERITY()      :      错误级别
ERROR_STATE()           :      错误状态
ERROR_MESSAGE()       :      错误信息
ERROR_LINE()               :      错误行
ERROR_PROCEDURE()    :      错误存储过程
XACT_STATE()               :      事务状态

前四个来自RAISERROR, 我们也可以用RAISERROR重新抛出错误.

XACT_STATE()的返回值
0     没有事务;             没有但前事务. 不能回滚事务, 因为这样做会导致错误
1     已提交的事务;      进程中有一个事物. 可回滚事务到一个安全点
-1    未提交的事务;      进程中有一个事物, 但是未提交的事务.必须完全回滚该事务(ROLLBACK TRANSACTION, 也许不会做任何可能导致写入事务日志的行动.例如回滚到一个安全点).

RAISERROR函数抛出错误, SQL Server 可以抛出错误状态为0的错误, RAISERROR不允许. RAISERROR只允许字符值或者变量作为输入, 所以上述的函数是不允许的, 必须先赋值给变量, 再给RAISERRROR使用.

RAISERROR ({msg_id | msg_str | @local variable}
    {, severity, state}
    [, argument [,...n ] ] )
    [WITH option [...n]]

:
DECLARE @msg AS NVARCHAR(MAX)
DECLARE @severity AS INT
DECLARE @state AS INT

set @msg = ERROR_MESSAGE()
set @severity = ERROR_SEVERITY()
set @state = ERROR_STATE()
RAISERROR(@msg, @severity, @state)

或者

begin try
    RAISERROR ('Error raised in TRY block .', 16, 1 )
end try
begin catch
    DECLARE @msg AS NVARCHAR(MAX)
    DECLARE @severity AS INT
    DECLARE @state AS INT

    set @msg = ERROR_MESSAGE()
    set @severity = ERROR_SEVERITY()
    set @state = ERROR_STATE()

    RAISERROR(@msg, @severity, @state)
end catch

结果:
Msg 50000, Level 16, State 1, Line 17
Error raised in TRY block .

posted on 2008-05-16 13:24  Niyo Wong  阅读(1005)  评论(0编辑  收藏  举报