在SQL Server2005中进行错误捕捉

任何程序都可能出现错误,在SQL Server中执行Transact-SQL也不例外。如果在Transact-SQL中发生了错误,一般有两种捕捉错误的方法,一种是在客户端代码(如C#、Delphi等)中使用类似try...catch的语句进行捕捉;另外一种就是在Transact-SQL中利用Transact-SQL本身提供的错误捕捉机制进行捕捉。如果是因为Transact-SQL语句的执行而产生的错误,如键值冲突,使用第一种和第二种方法都可以捕捉,但是如果是逻辑错误,使用客户端代码进行捕捉就不太方便。因此,本文就如何使用Transact-SQL进行错误捕捉进行了讨论。

一、非致命错误(non-fatal error)的捕捉

通过执行Transact-SQL而产生的错误可分为两种:致命错误(fatal error)和非致命错误(non-fatal error)。在Transact-SQL中只可以捕捉非致命错误(如键值冲突),而无法捕捉致命错误(如语法错误)。在Transact-SQL中可以通过系统变量@@ERROR判断最近执行的一条语句是否成功执行。如果发生了错误,@@Error的值大于0,否则值为0。下面举一个例子说明@@ERROR的使用。

假设有一个表table1,在这个表中有两个字段f1,f2。其中f1是主键。

insert INTO table1 VALUES(1, ’aa’)
insert INTO table1 VALUES(1, ’bb’) --这条语句将产生一个错误
IF @@ERROR > 0
PRINT ’键值冲突’

当执行第二条语句时发生键值冲突错误,@@ERROR被赋为错误号2627,因此输出结果显示’键值冲突’。使用@@ERROR系统变量时需要注意,@@ERROR只记录最近一次执行的Transact-SQL语句所发生的错误,如果最近一次执行的Transact-SQL没有发生错误,@@ERROR的值为0。因此,只能在被捕捉的那条Transact-SQL语句后使用@@ERROR。

在SQL Server中,不仅可以捕捉系统提供的错误,还可以自定义错误。有两种方法可以定义错误信息。

1、使用sp_addmessage系统存储过程添加错误信息,然后使用RAISERROR抛出错误。

sp_addmessage将错误号,错误级别、错误描述等信息添加到系统表中,然后使用RAISERROR根据相应的错误号抛出错误信息。用户自定义的信息应该从50001开始。

exec sp_addmessage @msgnum = 50001, @severity = 16,
@msgtext = ’sql encounter an error(%s).’,
@lang = ’us_english’
exec sp_addmessage @msgnum = 50001, @severity = 16,
@msgtext = ’sql遇到了一个错误(%1!).’

如果使用的SQL Server版本是非英语版本,在添加本地错误信息时必须首先添加英文的错误信息。错误描述可以象c语言中的printf的格式字符串一样使用参数,如%s、%d。但要注意的是在英文版的错误信息中要使用%s、%d等形式,而在本地化的错误信息中要使用%1!、%2!等形式,在每个%?(1 <= ? <= n)后需要加一个!,而且%?的数目必须和英文版的错误信息的参数一致。

在未插入本地化错误信息时,RAISERROR将使用英文版的错误信息。当插入本地化错误信息时,RAISERROR使用本地化的错误信息。

RAISERROR(50001, 16, 1, ’测试’)

输出的结果:

服务器: 消息 50001,级别 16,状态 1,行 1

sql遇到了一个错误(测试).

其中’测试’字符串通过%1传入本地化的错误描述字符串中。

2、直接使用RAISERROR将错误抛出。

使用第一种方法虽然使Transact-SQL语句看上去更整洁(这种方法类似于在编程语言中使用常量定义错误信息,然后在不同的地方通过错误编号引用这些错误信息。),但是这样做却使错误信息和数据库的耦合度增加,因为如果将这些带有RAISERROR的Transact-SQL放到别的SQL Server数据库上执行,由于在其它的数据库中还未添加错误信息,因此会产生RAISERROR调用错误,除非使用sp_addmessage将所需的错误信息再加入到其它的数据库中。

基于上述原因,RAISERROR不仅可以根据错误代码抛出错误信息,也可以直接通过错误描述格式字符串抛出错误信息。

RAISERROR(’sql遇到了一个错误(%s)’, 16, 1, ’测试’)

时间: 2024-08-28 17:46:06

在SQL Server2005中进行错误捕捉的相关文章

[转]在SQL Server2005中进行错误捕捉

原文:http://www.cnblogs.com/nokiaguy/archive/2008/05/09/1190551.html    任何程序都可能出现错误,在SQL Server中执行Transact-SQL也不例外.如果在Transact-SQL中发生了错误,一般有两种捕捉错误的方法,一种是在客户端代码(如 c#.delphi等)中使用类似try...catch的语句进行捕捉:另外一种就是在Transact-SQL中利用Transact-SQL本身提供的错误捕捉机制进行捕捉.如果是因为

体验SQL Server2005中T-SQL特性

错误处理一直是T-SQL开发的一个棘手部分.你曾经需要在基于逐个场景的基础上运行每一个语句和处理他们之后手动检查错误.事务管理也很烦琐,因为你得指出你的事务的状态,并恰当的回滚或提交.在SQL Server2005中,微软通过增加Try...Catch块到T-SQL中,提供了一个更新.更强大的错误处理能力. 异常处理很简单;在执行你的代码过程中有意外发生时,例如一个异常,你需要有一个例行方式去处理这个异常.要怎么处理这个异常是由作为开发者的你来决定的.为了增加一个异常处理到你的T-SQL代码中,

完美解决SQL server2005中插入汉字变成问号的问题_MsSql

关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击"属性",选择"选项"并点击.将其中的排序规则设置为:Chinese_PRC_CI_AS(选择下拉列表框即可设置),然后"确定". 2.在表中将你的汉字字段的数据类型设置为nvarchar型或ntext型,设置前最好先将表中的数据全部删除.(不要使用varchar或text型,因为它们只会继续使你的数据乱码). 3.设置好后,关闭服务器,再重新启动,就可生效

完美解决SQL server2005中插入汉字变成问号的问题

关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击"属性",选择"选项"并点击.将其中的排序规则设置为:Chinese_PRC_CI_AS(选择下拉列表框即可设置),然后"确定". 2.在表中将你的汉字字段的数据类型设置为nvarchar型或ntext型,设置前最好先将表中的数据全部删除.(不要使用varchar或text型,因为它们只会继续使你的数据乱码). 3.设置好后,关闭服务器,再重新启动,就可生效

深入理解SQL Server 中的错误处理

大多数迭代语言编译器都有内置的错误处理程序(例如,TRY-CATCH语句),开发者们在设计代码的时候可以利用它们.虽然SQL Server 2000的开发者不能够像迭代语言的开发者那样利用内置的工具,但是他们可以用系统变量@@ERROR来设计自己有效的错误处理工具. 引入事务 为了能够掌握在SQL Server 2000中错误处理是如何工作的,你必须首先要理解数据库事务的概念.在数据库术语中,事务就是指作为一个单独的工作单位出现的一系列语句.举个例子来说,假设你有三个语句要执行,事务就可以这样被

express请求流中的错误捕捉处理详解

nodejs中的错误处理还是比较麻烦的,尤其遇到异步回调之类,多层嵌套,简单的try-catch无法处理. 目前在用expressjs,拿此举例说说怎样实践. 第一种,从一介布衣那儿看到的方法,可行: const domain = require('domain'); app.use((req, res, next) => {   const reqDomain = domain.create();   // next抛出的异常在这里被捕获,触发此事件   reqDomain.on('error

SQL Server2005杂谈(4):在SQL Server2005中按列连接字符串的三种方法

本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:SQL Server2005杂谈(3):四个排名函数(row_number.rank.dense_rank和ntile)的比较 最近做一个项目,遇到一个在分组的情况下,将某一列的字段值(varchar类型)连接起来的问题,类似于sum函数对int型字段值求和. 如有一个表t_table,结构和数据如图1                                           图1     其中要按着xh字段分组,并且将每一组na

SQL Server2005 中的数据类型总结

 SQL Server 2005 中的数据类型归纳为下列类别:精确数字 bigint decimal int numeric smallint money tinyint smallmoney bit   近似数字 float real 日期和时间 datetime smalldatetime 字符串 char text varchar   Unicode字符串 nchar ntext nvarchar   二进制字符串 binary image varbinary   其他数据类型 curso

SQL Server2005中触发器的运用

编写过存储过程的人,再编写触发器时会发现:他们的语法.格式是非常类似的.其实触发器就是一种特殊类型的存储过程.他们都是预编译的,在程序正式编译前就由编译器进行编译,存储在服务器端. 不过,触发器与一般的存储过程也有些区别.触发器主要是通过对数据库的增删改的操作,或者是一个触发动作的触发作用等事件触发而被执行:而存储过程则是通过像传递SQL语句一样,传递存储过程的名字来被程序调用,实现功能. 触发器一共分为五种类型:Update触发器,Insert触发器.Delete触发器.Instead of触