@@ERROR 返回最后执行的 Transact-SQL 语句的错误代码。
语法 @@ERROR
返回类型 integer
注释 当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。
由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。
示例 A.用 @@ERROR 检测一个特定错误 下面的示例用 @@ERROR 在一个 UPDATE 语句中检测限制检查冲突(错误 #547)。
USE pubs GO UPDATE authors SET au_id = '172 32 1176 ' WHERE au_id = "172-32-1176 "
IF @@ERROR = 547 print "A check constraint violation occurred "
B.用 @@ERROR 有条件地退出一个过程 在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定传给调用程序的返回值,以指示此过程的成功与失败。
USE pubs GO
-- Create the procedure. CREATE PROCEDURE add_author @au_id varchar(11),@au_lname varchar(40), @au_fname varchar(20),@phone char(12), @address varchar(40) = NULL,@city varchar(20) = NULL, @state char(2) = NULL,@zip char(5) = NULL, @contract bit = NULL AS
-- Execute the INSERT statement. INSERT INTO authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract) values (@au_id,@au_lname,@au_fname,@phone,@address, @city,@state,@zip,@contract)
-- Test the error value. IF @@ERROR <> 0 BEGIN -- Return 99 to the calling program to indicate failure. PRINT "An error occurred loading the new author information " RETURN(99) END ELSE BEGIN -- Return 0 to the calling program to indicate success. PRINT "The new author information has been loaded " RETURN(0) END GO
C.用 @@ERROR 检测几条语句的成功 下面的示例取决于 INSERT 和 DELETE 语句的成功操作。局部变量在两条语句后均被设置为 @@ERROR 的值,并且用于此操作的共享错误处理例程中。
USE pubs GO DECLARE @del_error int, @ins_error int -- Start a transaction. BEGIN TRAN
-- Execute the DELETE statement. DELETE authors WHERE au_id = '409-56-7088 '
-- Set a variable to the error value for -- the DELETE statement. SELECT @del_error = @@ERROR
-- Execute the INSERT statement. INSERT authors VALUES( '409-56-7008 ', 'Bennet ', 'Abraham ', '415 658-9932 ', '6223 Bateman St. ', 'Berkeley ', 'CA ', '94705 ', 1) -- Set a variable to the error value for -- the INSERT statement. SELECT @ins_error = @@ERROR
-- Test the error values. IF @del_error = 0 AND @ins_error = 0 BEGIN -- Success. Commit the transaction. PRINT "The author information has been replaced " COMMIT TRAN END ELSE BEGIN -- An error occurred. Indicate which operation(s) failed -- and roll back the transaction. IF @del_error <> 0 PRINT "An error occurred during execution of the DELETE statement. "
IF @ins_error <> 0 PRINT "An error occurred during execution of the INSERT statement. "
ROLLBACK TRAN END GO
D. 与 @@ROWCOUNT 一同使用 @@ERROR 下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验 @@ERROR 的值,而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。
USE pubs GO CREATE PROCEDURE change_publisher @title_id tid, @new_pub_id char(4) AS
-- Declare variables used in error checking. DECLARE @error_var int, @rowcount_var int
-- Execute the UPDATE statement. UPDATE titles SET pub_id = @new_pub_id WHERE title_id = @title_id
-- Save the @@ERROR and @@ROWCOUNT values in local -- variables before they are cleared. SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT
-- Check for errors. If an invalid @new_pub_id was specified -- the UPDATE statement returns a foreign-key violation error #547. IF @error_var <> 0 BEGIN IF @error_var = 547 BEGIN PRINT "ERROR: Invalid ID specified for new publisher " RETURN(1) END ELSE BEGIN PRINT "ERROR: Unhandled error occurred " RETURN(2) END END
-- Check the rowcount. @rowcount_var is set to 0 -- if an invalid @title_id was specified. IF @rowcount_var = 0 BEGIN PRINT "Warning: The title_id specified is not valid " RETURN(1) END ELSE BEGIN PRINT "The book has been updated with the new publisher " RETURN(0) END GO
使用 @@ERROR 如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:
在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
在 Transact-SQL 语句完成后,马上把 @@ERROR 存储到一个整型变量中。此变量的值可供以后使用。 在生成错误的批处理、存储过程或触发器中,@@ERROR 是 Microsoft® SQL Server™ 2000 错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用 API 错误处理机制进行错误处理的应用程序中。同时,@@ERROR 只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。
@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为 0。完成每个 Transact-SQL 语句后,都要测试 @@ERROR 是否为 0。如果 @@ERROR 不是 0,将被存储在变量中。存储过程然后在 RETURN 语句中返回变量。如果过程中的 Transact-SQL 语句都没有错误,变量保持为 0。如果一个或多个语句生成错误,则变量包含最后的错误号。下面是有此逻辑的简单存储过程:
USE Northwind GO
DROP PROCEDURE SampleProcedure GO -- Create a procedure that takes one input parameter -- and returns one output parameter and a return code. CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT, @MaxQuantity INT OUTPUT AS -- Declare and initialize a variable to hold @@ERROR. DECLARE @ErrorSave INT SET @ErrorSave = 0
-- Do a SELECT using the input parameter. SELECT FirstName, LastName, Title FROM Employees WHERE EmployeeID = @EmployeeIDParm
-- Save any non-zero @@ERROR value. IF (@@ERROR <> 0) SET @ErrorSave = @@ERROR
-- Set a value in the output parameter. SELECT @MaxQuantity = MAX(Quantity) FROM [Order Details]
-- Save any non-zero @@ERROR value. IF (@@ERROR <> 0) SET @ErrorSave = @@ERROR
-- Returns 0 if neither SELECT statement had -- an error, otherwise returns the last error. RETURN @ErrorSave GO
也有 @@ERROR 与 @@ROWCOUNT 一起使用的时候。在以下的示例中,@@ERROR 用于确定是否出现违反约束的错误,而 @@ROWCOUNT 则在一些行被成功更改的情况下,用于确定由 UPDATE 语句修改的行数。
BEGIN TRAN UPDATE Northwind.dbo.Products SET UnitPrice = UnitPrice * 1.1 WHERE CategoryID IN (1, 2, 5, 6)
IF @@ERROR = 547 PRINT 'A CHECK CONSTRAINT violation occurred ' IF @@ROWCOUNT = 0 PRINT 'No rows updated. ' ELSE PRINT STR(@@ROWCOUNT) + ' rows updated. ' COMMIT -- Commits rows successfully updated.
|