异常处理被普遍认为是T-SQL脚本编程中的最弱的方面。幸运的是,这一点在SQL Server 2005中得到了改变,因为SQL Server 2005支持结构化异常处理。本文首先关注新特性“TRY……CATCH”的基本构成,然后在SQL Server 2000和SQL Server 2005中对照着看一些T-SQL的例子,这些例子中使用事务代码故意制造了一些违反约束限制的情况。将来的文章会继续探讨这一主题。
在SQL Server之前的版本中,你需要在执行INSERT,UPDATE,DELETE之后立即检查全局变量“@@error”来处理异常,如果“@@error”变量不为零的话(表示有错……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
异常处理被普遍认为是T-SQL脚本编程中的最弱的方面。幸运的是,这一点在SQL Server 2005中得到了改变,因为SQL Server 2005支持结构化异常处理。本文首先关注新特性“TRY……CATCH”的基本构成,然后在SQL Server 2000和SQL Server 2005中对照着看一些T-SQL的例子,这些例子中使用事务代码故意制造了一些违反约束限制的情况。将来的文章会继续探讨这一主题。
在SQL Server之前的版本中,你需要在执行INSERT,UPDATE,DELETE之后立即检查全局变量“@@error”来处理异常,如果“@@error”变量不为零的话(表示有错误),就接着执行一些纠正动作。开发人员常常重复这种与业务逻辑无关的代码,这会导致重复代码块,而且需要与GOTO语句和RETURN语句结合使用。
结构化异常处理为控制具有许多动态运行时特性的复杂程序提供了一种强有力的处理机制。目前,这种机制经实践证明是良好的,许多流行的编程语言(比如:微软的Visual Basic.Net和Visual C#)都支持这种异常处理机制。接下来你会在例子中看到,采用了这种健壮的方法以后,会使你的代码可读性和可维护性更好。TRY块包含了可能潜在失败的事务性代码,而CATCH块包含了TRY块中出现错误时执行的代码。如果TRY块中出现了任何错误,执行流程被调转到CATCH块,错误可以被处理,而出错函数可以被用来提供详细的错误信息。TRY……CATCH基本语法如下:
BEGIN TRY RAISERROR ('Houston, we have a problem', 16,1) END TRY BEGIN CATCH SELECT ERROR_NUMBER() as ERROR_NUMBER, ERROR_SEVERITY() as ERROR_SEVERITY, ERROR_STATE() as ERROR_STATE, ERROR_MESSAGE() as ERROR_MESSAGE END CATCH |
ERROR_NUMBER() 返回错误数量。
ERROR_SEVERITY() 返回错误严重等级。
ERROR_STATE() 返回错误状态号。
ERROR_PROCEDURE() 返回出错位置存储过程或者触发器的名称。
ERROR_LINE() 返回程序中引起错误的行号。
ERROR_MESSAGE() 返回错误信息的完整文本。错误内容包括可替换参数的值,比如:长度,对象名称或者时间。
我会先用SQL Server 2000演示一个简单例子,然后演示一个SQL Server 2005异常处理的例子。
下面是一个简单的存储过程示例,先用SQL Server 2000编写,然后改用SQL Server 2005实现。两者都从简单的表开始,我们在对这些表执行插入操作时会违反约束限制。下面是表结构:
create table dbo.Titles (TitleID int Primary Key identity, TitleName nvarchar(128) NOT NULL, Price money NULL constraint CHK_Price check (Price > 0)) create table dbo.Authors (Authors_ID int primary key identity, au_fname nvarchar(32) NULL, au_lname nvarchar(64) NULL, TitleID int constraint FK_TitleID foreign key references Titles(TitleID), CommissionRating int constraint CHK_ValidateCommissionRating Check (CommissionRating between 0 and 100)) create table dbo.Application_Error_Log (tablename sysname, userName sysname, errorNumber int, errorSeverity int, errorState int, errorMessage varchar(4000)) |
作者
翻译
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
SQL Server 2005支持服务结束 升级何去何从
SQL Server 2005的支持就要结束了,就在2016年4月12日,SQL Server 2005的客户们应该升级了。