SQL中的@@Error的使用
类别:数据库 浏览量:1851
时间:2013-9-16 SQL中的@@Error的使用
SQL中的@@Error的使用如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0;如果此语句产生错误,则 @@ERROR 返回错误号。每一个 Transact-SQL 语句完成时,@@ERROR 的值都会改变。
因为每个 Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:
-
在 Transact-SQL 语句后,马上检测或使用 @@ERROR。
- 在 Transact-SQL 语句完成后,马上把 @@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 保证更新已成功应用于表中的某行。
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
您可能感兴趣
- mysql快速备份数据(如何使用Maxwell实时同步mysql数据)
- sql数据库语言的两种使用方式(通过使用正确的search arguments来提高SQL Server数据库的性能)
- SQL语句分析工具Plan Explorer
- sql server中PageLatch和PageIOLatch等待
- sqlserver基础数据类型(SQL Server中T-SQL 数据类型转换详解)
- SQL SERVER 数据库外键
- SQL SERVER存储过程中使用事务与try catch
- 2021-10-24 10:26:05
- sqlserver 怎么排序(SQLserver排序规则基本概念探索)
- mysql并发控制的重要方式(Mysql服务添加 iptables防火墙策略的方案)
- mysql的视图和临时表区别(MySQL 内存表和临时表的用法详解)
- mysql完整整理(Mysql隔离性之Read View的用法说明)
- mysql字符串默认长度(MySQL 字符类型大小写敏感)
- mysql安装详解(MySQL Router的安装部署)
- mysql设计规则(专业级的MySQL开发设计规范及SQL编写规范)
- sql死锁进程保护(SqlServer查询和Kill进程死锁的语句)
- 中国留学生都是富二代吗()
- 我们现在吃的苹果是哪里来的 原来现代苹果引入中国仅有一百多年(我们现在吃的苹果是哪里来的)
- 买绿宝不能只挑黄绿色 菜农教你3招挑,个个皮薄肉脆,香甜爆汁(买绿宝不能只挑黄绿色)
- 大果肉搭配薄瓜皮, 绿宝 脆甜爽口,不愧是甜瓜中的 佼佼者(大果肉搭配薄瓜皮)
- 河南尉氏县因地制宜发展果蔬种植 水坡镇绿宝甜瓜变 金瓜(河南尉氏县因地制宜发展果蔬种植)
- 谢广坤,你这么欺负谢腾飞,良心不会痛吗(你这么欺负谢腾飞)
热门推荐
- 如何替换html5视频播放器(HTML5自定义视频播放器源码)
- 手机网站设计的几个建议
- python制作彩色字符(Python3利用print输出带颜色的彩色字体示例代码)
- flink重启机制(浅谈Flink容错机制之作业执行和守护进程)
- sqlserver实例全库备份(sql server通过脚本进行数据库压缩全备份的方法推荐)
- apache怎么安装服务(apache后缀名支持 让apache支持apk ipk下载的方法)
- nginx流媒体服务搭建与应用(用nginx+FastDFS一步步搭建文件管理系统)
- laravel数据库日志(Laravel 将数据表的数据导出,并生成seeds种子文件的方法)
- vuefor指令使用教程(Vue必学知识点之forEach的使用)
- docker主机路径与容器路径(Docker容器没有权限写入宿主机目录的解决方案)