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

 Transact-SQL 语法约定

 语法
sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程
 
 @@ERROR
 返回类型
sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程

integer

 备注
sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程

如果前一个 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)。

 示例
sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程

A. 用 @@ERROR 检测一个特定错误

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

sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程_05 复制代码
USE AdventureWorks;

GO

UPDATE HumanResources.Employee 

    SET PayFrequency = 4

    WHERE NationalIDNumber = 615389812;

IF @@ERROR = 547

    PRINT N'A check constraint violation occurred.';

GO

B. 用 @@ERROR 有条件地退出一个过程

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

sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程_05 复制代码
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

D. 与 @@ROWCOUNT 一同使用 @@ERROR

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

sql server 2005 T-SQL @@ERROR (Transact-SQL)_存储过程_05 复制代码
USE AdventureWorks;

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, 

    @EmployeeID INT

AS

-- Declare variables used in error checking.

DECLARE @ErrorVar INT, 

    @RowCountVar INT;


-- Execute the UPDATE statement.

UPDATE PurchaseOrderHeader 

    SET EmployeeID = @EmployeeID 

    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 @EmployeeID 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 EmployeeID specified is not valid';

        RETURN 1;

    END

ELSE

    BEGIN

        PRINT 'Purchase order updated with the new employee';

        RETURN 0;

    END;

GO