在SQL SERVER存储过程中这样写:
create proc AAA
as
  begin tran
    update A set ......
    if @@error<>0 --A
      rollback tran
    update B set ......
    if @@error<>0 --B
      rollback tran
  commit tran
go请问这样写会不会有问题?
SQL Server中@@error代表什么意思?
当出现SQL SERVER自身错误时(非存储过程AAA出错),@@error值会不会变化?
在DELPHI中调用此过程时,会出现数据没有变化的情况,什么原因?

解决方案 »

  1.   

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

  2.   

    如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理: 在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
    在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。 
    在生成错误的批处理、存储过程或触发器中,@@ERROR 是 Microsoft&reg; SQL Server&#8482; 2000 错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。同时,@@ERROR 只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。
      

  3.   

    楼主,事务里可以放多个update或insert的,不用每执行一个就来一行if ,那使用事务就没有意义了,因为单行的update或insert有隐性事务
       @@error=0表示事务中的所有update或insert都已成功执行,反之至少有一条执行出错,这时你就可以用rollbacktrans,取消操作了
       @@error是SQL内部全局变量,如果SQL都出来错误,那数据的准确性当然就没有保证了,但这种情会有,但非常非常少,可不用考虑
      

  4.   

    我认为@@ERROR代表数据库内部有错,非存储过程它的值不会变化,
    内部调用没有问题,而是SQL语句有错。
      

  5.   

    如果我的应用软件(EXE)有三个客户端,@@error变量是不是共用的?