Sql Server 中关于@@ERROR的一个小小误区
我们经常写存储过程的时候会用到@@ERROR来判断执行是否成功,很久没有写复杂点的存储过程了,今天发现前段时间写的一个proc出现了bug,由于定义参数时,字符串长度设的有点短,导致传进来的值中间被截断,出现数据错乱的问题,才发现最后的一句:
IF(@@ERROR<>0)
BEGIN
ROLLBACK TRAN
END
前面明明已经出错了,可是在这里@@ERROR 一直都是0,这时才发现问题,下面举例说明,
DECLARE @NowTime DATETIME;
BEGIN TRAN
RAISERROR ('假设这里抛出异常!',16,1);
SET @NowTime=GETDATE();
IF ( @@ERROR <> 0 )
BEGIN
SELECT ERROR_MESSAGE() Result;
ROLLBACK TRAN
END
ELSE
SELECT 'Success' Result;
COMMIT TRAN
例如上面的语句中,我在执行获取当前时间之前,抛出了一个异常,那么按照我们想要的它应该回滚当前事务,输出ERROR_MESSAGE()错误信息,可实际上执行的结果是“Success”,看到这里不由的想到另一个与之类似的默认的参数,@@IDENTITY,这个可以返回sql执行最后依次的标识值,我们知道如果@@IDENTITY不紧跟你最后的sql语句的时候,那么你无法获取想要的结果,这里的@@ERROR也是类似的,所以原因就很明显了,我抛出异常后,下面接着执行的是 SET @NowTime=GETDATE(); 这条语句是没有错误的,所以最终@@ERROR始终是0,所以最后事务还是提交了,另外注意下@@ERROR并不是获取的错误的次数,而是有一定含义的错误码。
那么这种情况该如何解决呢,很简单,TRY CATCH ,真的是很久不写存储过程了,忽略了这一点,当其中一条语句出现异常时,立马抛出异常并接收异常,回滚事务就可以了,作出如下修改:
DECLARE @NowTime DATETIME;
BEGIN TRY
BEGIN TRAN
RAISERROR ('假设这里抛出异常!',16,1);
SET @NowTime=GETDATE();
COMMIT TRAN;
SELECT 'Success' Result;
END TRY
BEGIN CATCH
SELECT @@ERROR Error;
SELECT ERROR_MESSAGE() Result;
ROLLBACK TRAN
END CATCH
执行结果如下:
所以记住,以后再写复杂的存储过程或者用到事务的时候最好加上TRY CATCH 。
Sql Server 中关于@@ERROR的一个小小误区的更多相关文章
- SQL Server 中关于 @@error 的一个小误区
在SQL Server中,我常常会看到有些前辈这样写: ) ROLLBACK TRANSACTION T else COMMIT TRANSACTION T 一开始,我看见别人这么写,我就想当然的以为 ...
- Sql Server 中的 @@ERROR
@@ERROR:当前一个语句遇到错误,则返回错误号,否则返回0.需要注意的是@ERROR在每一条语句执行后会被立刻重置,因此应该在要验证的语句执行后检查数值或者是将它保存到局部变量中以备将来使用. D ...
- SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理 ...
- 在 SQL Server 中使用 Try Catch 处理异常
如何在 SQL Server 中使用 Try Catch 处理错误? 从 SQL Server 2005 开始,我们在TRY 和 CATCH块的帮助下提供了结构错误处理机制.使用TRY-CATCH的语 ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- SQL Server中事务、锁定和阻塞
事务是什么 在SQL Server中事务是构成一个工作逻辑单元的一系列任务,也就说多个任务放在一起执行,这些任务要么全部执行成功,要么全部执行失败. 通过事务我们可以保证数据的完整性,例如:用户A给用 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- Sql Server 中一个非常强大的日期格式化函数
Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0)-- 05 16 2006 10:57AMSelect CONV ...
- SQL Server中一个隐性的IO性能杀手-Forwarded record
简介 最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动.本篇文章分享什么是forwarded record,并从原理上谈一 ...
随机推荐
- 编译hadoop2.6.0 cdh 5.4.5 集成snappy压缩
原文地址:http://www.cnblogs.com/qiaoyihang/p/6995146.html 自带的为32位库,故需要把64为重编译进去 1.下载源码:http://archive-pr ...
- Python基础、判断、循环、列表、字典,day1
一.Python 简介 1.介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标 ...
- image_Magic图片处理功能
:] 来自为知笔记(Wiz)
- shiro 拦截器
参考
- org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类
<bean id="investorQueryConfigurer" class="org.springframework.beans.factory.config ...
- Codeforces Round #395 (Div. 2)B. Timofey and cubes
地址:http://codeforces.com/contest/764/problem/B 题目: B. Timofey and cubes time limit per test 1 second ...
- Zabbix Windos agent 安装
系统:Windos 2008 R2 x64 服务:Zabbix_agents_3.0.4.win 一.安装Zabbix_agents_3.0.4.win 1.下载Zabbix_agents_3.0.4 ...
- Xshell 或者 Xftp 突然连不上阿里云
今天突然发现使用xshell 远程连接不上阿里云,废了好大的劲,才明白的差不多.只要不出意外有以下几种情况:1.安全组中有没有你需要连接的端口,2.防火墙是否关闭,3.端口是否开放权限,4.是否安装了 ...
- 剑指offer题解02-10
02 单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 从具体实现角 ...
- 开源CMDB详细安装使用
CMDB的GitHub地址: https://github.com/open-cmdb/cmdb 环境说明 [root@WCY ~]# cat /etc/redhat-release CentOS L ...