1. @@error是离它最近一条语句的执行结果, 所以无法解决问题.

解决方案 »

  1.   

    @@ERROR
    返回最后执行的 Transact-SQL 语句的错误代码。语法
    @@ERROR返回类型
    integer注释
    当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。
      

  2.   

    ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。ROLLBACK 还释放由事务控制的资源。不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到最远的 BEGIN TRANSACTION 语句。在这两种情况下,ROLLBACK TRANSACTION 均将 @@TRANCOUNT 系统函数减为 0。ROLLBACK TRANSACTION savepoint_name 不减少 @@TRANCOUNT。ROLLBACK TRANSACTION 语句若指定 savepoint_name 则不释放任何锁。在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,ROLLBACK TRANSACTION 不能引用 savepoint_name。在执行 COMMIT TRANSACTION 语句后不能回滚事务。在事务内允许有重复的保存点名称,但 ROLLBACK TRANSACTION 若使用重复的保存点名称,则只回滚到最近的使用该保存点名称的 SAVE TRANSACTION。在存储过程中,不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 语句将所有语句回滚到最远的 BEGIN TRANSACTION。在存储过程中,ROLLBACK TRANSACTION 语句使 @@TRANCOUNT 在触发器完成时的值不同于调用该存储过程时的 @@TRANCOUNT 值,并且生成一个信息。该信息不影响后面的处理。如果在触发器中发出 ROLLBACK TRANSACTION: 将回滚对当前事务中的那一点所做的所有数据修改,包括触发器所做的修改。
    触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。
    在批处理中,不执行所有位于激发触发器的语句之后的语句。 
    每次进入触发器,@@TRANCOUNT 就增加 1,即使在自动提交模式下也是如此。(系统将触发器视作隐性嵌套事务。)在存储过程中,ROLLBACK TRANSACTION 语句不影响调用该过程的批处理中的后续语句;将执行批处理中的后续语句。在触发器中,ROLLBACK TRANSACTION 语句终止含有激发触发器的语句的批处理;不执行批处理中的后续语句。ROLLBACK TRANSACTION 语句不生成显示给用户的信息。如果在存储过程或触发器中需要警告,请使用 RAISERROR 或 PRINT 语句。RAISERROR 是用于指出错误的首选语句。ROLLBACK 对游标的影响由下面三个规则定义: 当 CURSOR_CLOSE_ON_COMMIT 设置为 ON 时,ROLLBACK 关闭但不释放所有打开的游标。
    当 CURSOR_CLOSE_ON_COMMIT 设置为 OFF 时,ROLLBACK 不影响任何打开的同步 STATIC 或 INSENSITIVE 游标,也不影响已完全填充的异步 STATIC 游标。将关闭但不释放任何其它类型的打开的游标。
    对于导致终止批处理并生成内部回滚的错误,将释放在含有该错误语句的批处理内声明的所有游标。不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设置,所有游标均将被释放,其中包括在该错误批处理所调用的存储过程内声明的游标。在该错误批处理之前的批处理内声明的游标以规则 1 和 2 为准。死锁错误就属于这类错误。在触发器中发出的 ROLLBACK 语句也自动生成这类错误。
      

  3.   

    感谢邹大哥指点,我比较关心一般这样的事务怎样写才有效?是要做一个变量把每一步
    @@error加起来?
      

  4.   

    每一步都判断@@error, 如果出错, 则回滚事务并退出, 或者根据需要处理.