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,并从原理上谈一 ...
随机推荐
- root Permission denied
w 遇见现象,原因待查
- python中open函数的使用
转自:https://www.cnblogs.com/R-ling/p/8412578.html 一.open()的函数原型open(file, mode=‘r', buffering=-1, enc ...
- Java 之反射机制
java 语言的反射机制 - 在运行状态中,对于任意一个类 (class 文件),都能够知道这个类的所有属性和方法; - 能动态获取类中的信息,也可以理解为对类(字节码文件)的解剖 描述字节码文件的类 ...
- 数据库字符集(AL32UTF8)和客户端字符集(2%)是不同的
登录oracle数据库时我们会遇到这样的提示信息:“数据库字符集(AL32UTF8)和客户端字符集(2%)是不同的”. 这是由于数据库服务端和客户端的字符集不一致所造成的,服务端字符集和客户端字符集相 ...
- 四.mysql演示银行转账
代码演示: #conding:utf8 import pymysql import sys class TransferMoney(object): def __init__(self,conn): ...
- form表单学习
1.http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html 2.http://www.cnblogs.com/polk6/arch ...
- python 对象和类
python中所有数据都是以对象形式存在.对象既包含数据(变量),也包含代码(函数),是某一类具体事物的特殊实例. 面向对象的三大特性为封装.继承和多态. 1.定义类 #定义空类 class Pers ...
- httpmessageconverter requestbody responsebody
@ResponseBody @RequestMapping("/testHttpMessageConverter") public String testHttpMessageCo ...
- PAT 天梯赛 L1-002 【递归】
题目链接 https://www.patest.cn/contests/gplt/L1-002 题意 给出一个数字 和一个字符 画出 可用数字下的最大沙漏,并且输出剩余没用掉的符号数 思路 可以先打一 ...
- PHP memcache扩展模块安装
安装php扩展模块memcache memcache 的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率,减轻后端数据库的读写压力. ...