关于sql server 中 @@error 问题


首先看MSN上的解释:

     返回执行的上一个 Transact-SQL 语句的错误号。

返回类型 integer

 备注:  

如果前一个 Transact-SQL 语句执行没有错误,则返回 0。

如果前一个语句遇到错误,则返回错误号。如果错误是 sys.messages 目录视图中的错误之一,则 @@ERROR 将包含 sys.messages.message_id 列中表示该错误的值。可以在 sys.messages 中查看与 @@ERROR 错误号相关的文本信息。

由于 @@ERROR 在每一条语句执行后被清除并且重置,因此应在语句验证后立即查看它,或将其保存到一个局部变量中以备以后查看。

SQL Server 2005 数据库引擎 引入 TRY...CATCH 构造来处理错误。TRY...CATCH 构造也支持其他返回的错误信息多于 @@ERROR 的系统函数(ERROR_LINE、ERROR_MESSAGE、ERROR_PROCEDURE、ERROR_SEVERITY 和 ERROR_STATE)。TRY...CATCH 也支持 ERROR_NUMBER 函数,但不限制该函数在语句产生错误后立即在语句中返回错误号。有关详细信息,请参阅 TRY...CATCH (Transact-SQL)

 示例:  用 @@ERROR 有条件地退出一个过程:

USE AdventureWorks;
GO
-- Drop the procedure if it already exists.
IF OBJECT_ID(N
'HumanResources.usp_DeleteCandidate', N'P')
             IS NOT NULL
    DROP PROCEDURE HumanResources.usp_DeleteCandidate;
GO
-- Create the procedure.
CREATE PROCEDURE HumanResources.usp_DeleteCandidate 
    @CandidateID INT
AS
-- Execute the DELETE statement.
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID 
= @CandidateID;
-- Test the error value.
IF @@ERROR 
<> 0 
    BEGIN
        
-- Return 99 to the calling program to indicate failure.
        PRINT N
'An error occurred deleting the candidate information.';
        RETURN 
99;
    END
ELSE
    BEGIN
        
-- Return 0 to the calling program to indicate success.
        PRINT N
'The job candidate has been deleted.';
        RETURN 
0;
    END;
GO



begin   tran ok --开始一个事务 OK
delete  from  rxqz  where qz=   'rx015 ' --删除数据 
save tran  bcd   --保存一个事务点 命名为 bcd
update  sz  set   name='李丽s' where name= '李丽'--修改数据
if  @@error=0  --判断修改数据有没有出错   
begin --如果出错  
rollback   tran  bcd  -- 回滚事务到 BCD 的还原点
commit   tran  ok  --提交事务
end  
else  --出错
commit  tran ok --提交事务
 

@@error=0 是判断
update   sz   set   name= '李丽s '   where   name= '李丽 ' 这句有没有报错

SAVE TRANSACTION
在事务内设置保存点。


用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事务可以返回的位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要取消整个事务,请使用 ROLLBACK TRANSACTION transaction_name 格式。这将撤消事务的所有语句和过程。
 
@@error判断是否有错误,但是对那种重大错误无法捕捉

而且@@error只能前一句sql语句生效

posted on 2008-04-13 21:41  鱼跃于渊  阅读(335)  评论(0)    收藏  举报

导航