在SQL Server 2005数据库中进行错误捕捉(2)
作者:Blithe 发布时间:2008-12-02 14:39:00
二、逻辑错误的捕捉
在实际应用中,更多的是由于某些业务要求而产生的逻辑错误。这些错误无法通过@@ERROR进行捕捉。如果使用客户端代码进行捕捉,那么Transact-SQL必须一条一条地执行。如果使用存储过程,那么发生在存储过程内部的逻辑错误就很难在客户端代码中进行捕捉,因此,下面将讨论如何使用Transact-SQL捕捉逻辑错误。
所谓逻辑错误,就是在执行完Transact-SQL后,执行结果与业务要求的结果不符而产生的。为了说明如何处理逻辑错误,我们再建立一个表table2,这个表的结构和table1完全一样,只是f1字段不再是主键了。然后建立一个存储过程,它的功能是在table1和table2中同时插入一条记录,但是这条记录必须满足两个条件。
1.f1值不能大于100
2.要插入的记录在table1中不存在,如果存在,在table1和table2中都不插入这条记录
CREATE PROCEDURE p1(@Num int)
AS
DECLARE @Error int, @RowCount int
BEGIN TRANSACTION
INSERT INTO table2 VALUES(@Num, 'p')
IF @Num > 100
BEGIN
RAISERROR('%s的值不能大于100。', 16, 1, '@Num')
ROLLBACK TRANSACTION
RETURN 1
END
ELSE
BEGIN
SELECT f1 FROM table1 WHERE f1 = @Num
IF @@ROWCOUNT > 0
BEGIN
RAISERROR('table1中已经存在%d了。', 16, 1, @Num)
ROLLBACK TRANSACTION
RETURN 2
END
ELSE
BEGIN
INSERT INTO table1 VALUES(@Num, 'p')
COMMIT TRANSACTION
RETURN 0
END
END
在这个存储过程中一开始使用BEGIN TRANSACTION显示地开始一个事务,然后当上述两种错误发生时使用ROLLBACK TRANSACTION恢复到初始状态,如果成功插入,使用COMMIT TRANSACTION提交改变。可以通过如下语句进行调用。
DECLARE @ErrNum int
EXEC @ErrNUm = p1 2
PRINT @ErrNum
可以通过@ErrNum得到p1返回的错误代码,如果返回0,表示执行成功。


猜你喜欢
- 一、实验环境1.Windows7x64_SP12.anaconda3.7 + python3.7(anaconda集成,不需单独安装)3.p
- PHP程序员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用
- 1.操作数据库 1.1创建数据库create + database + 数据库名称当然如果我们不知道数据库是否存在,如果存在就不创
- 对象Javascript 根本上是和对象相关的。数组是对象。函数是对象。对象是对象。那什么是对象呢?对象是名-值对的集合。名是字符串,值可以
- 本例设置为垂直左侧scroll主要思想是利用一个长度为0的mid_frame,高度为待设置qwidget的高度,用mid_frame的mov
- python的requests它是python的一个第三方库,处理URL比urllib这个库要方便的多,并且功能也很丰富。【可以先看4,5表
- 在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。为了解决这些问题,在2003年I
- 实例如下: $(document).on("click",".admin-side-friend",
- 1. 模型1.1. 模型定义type User struct { gorm.Model
- 列表(List) 的三种遍历(序号和值)方法if __name__ == '__main__':
- 移动互联网被称为“第五次科技革命”,而随着iPhone和Android等智能手机的日渐流行和iPad等平板电脑的出现,移动互联网的潜力和趋势
- 本文实例讲述了Python操作mongodb数据库的方法。分享给大家供大家参考,具体如下:安装pymongo下载pymongo:https:
- 在开发数据库应用中,经常会遇到处理时间的问题,如查询指定时间的记录等。下面就这些常见的问题,结合自己的一些经验,和大家探讨一下这类问题。首先
- 本文实例为大家分享了JavaScript/jQuery实现切换页面效果的具体代码,供大家参考,具体内容如下<!DOCTYPE html
- eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式
- 1.mysql中or语法的使用,在mysql语法中or使用注意点。 项目遇到坑,遍历发放奖励数据查询错误!!!$sql = 'SEL
- DOM遍历基于ID、元素类型、类名查找元素非常有用,但是如果你想基于它在DOM树中的位置来查找元素该怎么办?换句话说,你有一个给定的元素,你
- dataclass语法一、 简介官方文档的地址为:https://docs.python.org/3.9/library/dataclass
- order by 查询语句使用也是非常频繁,有时候数据量大了会发现排序查询很慢,本文就介绍一下 MySQL 是如何进行排序的,以及如何利用其
- 1. 生命周期(重要)1.1 初步认识生命周期别名:生命周期回调函数、生命周期函数、生命周期钩子。生命周期是什么?Vue在关键时刻帮我们调用