当前位置:数据库 > SQL语言> 正文

SQL中的@@Error的使用

时间:2013-9-16类别:数据库

SQL中的@@Error的使用

SQL中的@@Error的使用

如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。

因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:

@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。

实例:

1、用 @@ERROR 检测一个特定错误

  • 以下示例用 @@ERROR 在 UPDATE 语句中检测约束检查冲突(错误 #547)。

  •  
  • 
    USE AdventureWorks2012;
    GO
    UPDATE HumanResources.EmployeePayHistory
        SET PayFrequency = 4
        WHERE BusinessEntityID = 1;
    IF @@ERROR = 547
        PRINT N'A check constraint violation occurred.';
    GO
    				

     

  • 2、用 @@ERROR 有条件地退出一个过程

  • 以下示例使用 IF...ELSE 语句在存储过程中测试 INSERT 语句后的 @@ERROR 变量的值将确定发送给调用程序的返回代码,以指示此过程的成功与失败。

  • 
    USE AdventureWorks2012;
    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
    			
  •  

    3、与 @@ROWCOUNT 一同使用 @@ERROR

  • 下面的示例将 @@ERROR 与 @@ROWCOUNT 一起使用来验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验 @@ERROR,并且用 @@ROWCOUNT 保证更新已成功应用于表中的某行。

  •  
  • SQL 代码   复制
  • 
    USE AdventureWorks2012;
    GO
    IF OBJECT_ID(N'Purchasing.usp_ChangePurchaseOrderHeader',N'P')IS NOT NULL
        DROP PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader;
    GO
    CREATE PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader
        (
        @PurchaseOrderID INT
        ,@BusinessEntityID INT
       )
    AS
    -- Declare variables used in error checking.
    DECLARE @ErrorVar INT;
    DECLARE @RowCountVar INT;
    
    -- Execute the UPDATE statement.
    UPDATE PurchaseOrderHeader 
        SET BusinessEntityID = @BusinessEntityID 
        WHERE PurchaseOrderID = @PurchaseOrderID;
    
    -- Save the @@ERROR and @@ROWCOUNT values in local 
    -- variables before they are cleared.
    SELECT @ErrorVar = @@ERROR
        ,@RowCountVar = @@ROWCOUNT;
    
    -- Check for errors. If an invalid @BusinessEntityID was specified,
    -- the UPDATE statement returns a foreign key violation error #547.
    IF @ErrorVar <> 0
        BEGIN
            IF @ErrorVar = 547
                BEGIN
                    PRINT N'ERROR: Invalid ID specified for new employee.';
                     RETURN 1;
                END
            ELSE
                BEGIN
                    PRINT N'ERROR: error '
                        + RTRIM(CAST(@ErrorVar AS NVARCHAR(10)))
                        + N' occurred.';
                    RETURN 2;
                END
        END
    
    -- Check the row count. @RowCountVar is set to 0 
    -- if an invalid @PurchaseOrderID was specified.
    IF @RowCountVar = 0
        BEGIN
            PRINT 'Warning: The BusinessEntityID specified is not valid';
            RETURN 1;
        END
    ELSE
        BEGIN
            PRINT 'Purchase order updated with the new employee';
            RETURN 0;
        END;
    GO
    			

     

  •  

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐