SQL2000中关于全局变量@@Error的来龙去脉

gxj760998 2010-07-08 01:58:53
一直都以为这个@@Error变量是全局的、系统的。结果今天发现,它不是系统级的。
与当前连接的会话有关系。虽然有了这个结果,但找了不少资料,没有正式说明出来。请指出其来龙去脉!
...全文
218 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sean20032000 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 orchidcat 的回复:]
SQL code
因为每个 Transact-SQL 语句完成时,@@ERROR 都会获得一个新值,可以用以下两种方法之一处理 @@ERROR:

1、在 Transact-SQL 语句完成后,立即测试或使用 @@ERROR。


2、在 Transact-SQL 语句完成后,立即将 @@ERROR 保存到整数变量中。此变量的值可供以后使用。
[/Quote]

今天刚刚遇到一个问题,就是通过这种方法结局的呃
gxj760998 2010-07-08
  • 打赏
  • 举报
回复
@@functions 被称为全局变量,但它们不是变量,也不具备变量的行为。@@functions 是系统函数,它们的语法遵循函数的规则。

我刚刚试了另外一个函数。
print @@CPU_BUSY 这个是会话无关系的。
老黎 2010-07-08
  • 打赏
  • 举报
回复
mark!!
ask_chang 2010-07-08
  • 打赏
  • 举报
回复
注释
当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

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


注意:
某些 Transact-SQL 系统函数的名称以两个 at 符号 (@@) 打头。虽然在 Microsoft SQL Server 的早期版本中,@@functions 被称为全局变量,但它们不是变量,也不具备变量的行为。@@functions 是系统函数,它们的语法遵循函数的规则。
永生天地 2010-07-08
  • 打赏
  • 举报
回复
注意:
某些 Transact-SQL 系统函数的名称以两个 at 符号 (@@) 打头。虽然在 Microsoft SQL Server 的早期版本中,@@functions 被称为全局变量,但它们不是变量,也不具备变量的行为。@@functions 是系统函数,它们的语法遵循函数的规则。


http://technet.microsoft.com/zh-cn/library/ms187953.aspx

@@error是系统函数
gxj760998 2010-07-08
  • 打赏
  • 举报
回复
得出这个结论让我感到非常意外,期望有人了解,讲讲其原理什么的。我BAIDU翻了几十页,没有正式的文档说明这个现象。一般我都不翻国外的资料,望有知道的指点下,我想了解得更清楚点,谢谢。
永生天地 2010-07-08
  • 打赏
  • 举报
回复
经过测试,lz说的没错,
@@error是会话级的变量,不同会话的@@error是不同的
rucypli 2010-07-08
  • 打赏
  • 举报
回复
@@ERROR 在每一条语句执行后被清除并且重置,因此应在语句验证后立即查看它,或将其保存到一个局部变量中以备以后查看
Mr_Nice 2010-07-08
  • 打赏
  • 举报
回复
因为每个 Transact-SQL 语句完成时,@@ERROR 都会获得一个新值,可以用以下两种方法之一处理 @@ERROR:

1、在 Transact-SQL 语句完成后,立即测试或使用 @@ERROR。


2、在 Transact-SQL 语句完成后,立即将 @@ERROR 保存到整数变量中。此变量的值可供以后使用。
SQL77 2010-07-08
  • 打赏
  • 举报
回复
联机讲得好详细咯
claro 2010-07-08
  • 打赏
  • 举报
回复
纯帮顶
东那个升 2010-07-08
  • 打赏
  • 举报
回复
这个看联机吧。。。比较详细
guguda2008 2010-07-08
  • 打赏
  • 举报
回复
如果前一个 Transact-SQL 语句执行没有错误,则返回 0。

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

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

使用 TRY...CATCH 构造来处理错误。TRY...CATCH 构造也支持其他返回的错误信息多于 @@ERROR 的系统函数(ERROR_LINE、ERROR_MESSAGE、ERROR_PROCEDURE、ERROR_SEVERITY 和 ERROR_STATE)。TRY...CATCH 也支持 ERROR_NUMBER 函数,但不限制该函数在语句产生错误后立即在语句中返回错误号。
htl258_Tony 2010-07-08
  • 打赏
  • 举报
回复
返回执行的上一个 Transact-SQL 语句的错误号。

Transact-SQL 语法约定

语法

@@ERROR


返回类型
integer

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

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

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



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

复制代码
USE AdventureWorks;
GO
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 4
WHERE EmployeeID = 1;
IF @@ERROR = 547
PRINT N'A check constraint violation occurred.';
GO


B. 用 @@ERROR 有条件地退出一个过程
在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@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


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

复制代码
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;
DECLARE @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
来龙去脉
nightmaple 2010-07-08
  • 打赏
  • 举报
回复
不清楚,马克一下等高人~

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧