请大家详细的说说  
@@error
xact_abort
try/catch
这三种异常捕获机制的 异同点

解决方案 »

  1.   

    SET XACT_ABORT
    指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。这个跟另外两个不一样啊。 
      

  2.   

    各司其职Try catch 用于发现错误 ↓@@error 可以定位出具体错误号(在 sys.messages 列表中) ↓XACT_ABORT 错误发生时,SQL Server 该如何处理(是否自动回滚)
      

  3.   

    @@ERROR是一个系统变量,会在存储过程遇到错误时返回一个错误号
    具体参见http://msdn.microsoft.com/zh-cn/library/ms188790.aspx
    TRY……CATCH是一个捕获异常的语句,主要用来在存储过程中捕获某一段代码的异常
    http://msdn.microsoft.com/zh-cn/library/ms175976.aspx
    XACT_ABORT这个主要用于对于事务如果发生异常,可以回滚
    http://msdn.microsoft.com/zh-cn/library/ms188792.aspx
      

  4.   

    参考:
    http://msdn.microsoft.com/zh-cn/library/ms190193(v=SQL.90).aspx
      

  5.   

    1.@@error 是每次执行一个语句,就会系统就会修改@@error的值,以体现语句是否报错,
    所以,你没执行一条语句,都需要判断一次,如果有错误,那就rollback,如果一个存储过程中,有好多语句,那没你需要判断N次,非常不方便。
    2.xact_abort是只要在执行语句中报错了,那么系统自动回滚,非常方便,而且能在系统出现某些错误时,也能回滚,比如,delete from t,而这个表t根本不存在的时候,这个选项,仍然能回滚。3.try catch,就和很多高级程序一样,捕获异常,然后处理异常。但自己在使用时发现,在存储过程中,有些异常用try catch,根本捕获不到,这个时候异常会返回到更上层,所以一般在用的时候,都是这样的:create proc proc_t(@i int)
    asselect 5 * 1.0 / @i
    go
    --1.不会报错
    begin try
    begin tran
    exec proc_t 1
    select '执行成功'
    commit tran
    end try
    begin catch
      select '执行失败'
      if @@trancount >0 
         rollback
    end catch
    --2.这次会报错,因为分母为0
    begin try
    begin tran
    exec proc_t 0
    select '执行成功'
    commit tran
    end try
    begin catch
      select '执行失败'
      if @@trancount >0 
         rollback
    end catch
    这样,就可以捕获存储过程抛出的异常
      

  6.   

    @@error 返回执行的上一个 Transact-SQL 语句的错误号。
     参考 http://technet.microsoft.com/zh-cn/library/ms188790(v=sql.105).aspxxact_abort 指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。
     参考 http://technet.microsoft.com/zh-cn/library/ms188792(v=sql.105).aspxtry/catch 对 Transact-SQL 实现与 Microsoft Visual C# 和 Microsoft Visual C++ 语言中的异常处理类似的错误处理。Transact-SQL 语句组可以包含在 TRY 块中。如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。
     参考 http://technet.microsoft.com/zh-cn/library/ms175976(v=sql.105).aspx三者一般是结合使用的,以下经典用法.-- 1.适用于SQL2000.
    set xact_abort on
    begin tran
     [事务代码]
    commit tran-- 2.适用于SQL2000.
    begin tran
     [事务语句1]
     if @@error<>0
     begin
       rollback tran
       goto ext
     end
     
     [事务语句2]
     if @@error<>0
     begin
       rollback tran
       goto ext
     end
    commit tran 
    ext:
      select error_message()-- 3.适用于SQL2005,2008.
    begin try
       begin tran
       [事务代码]
       commit tran
    end try
    begin catch
       rollback tran
       select error_number() as error_number ,
              error_message() as error_message,
              error_state() as error_state,
              error_severity() as error_severity
    end catch