首页 > 开发 > 综合 > 正文

在SQLServer的存储过程中处理错误

2024-07-21 02:12:02
字体:
来源:转载
供稿:网友
 sql server 存储进程中的“错误处理”只是向客户端返回错误,通常访问提供者可以自
己做。但是至少你可以知道在执行t-sql的时候何止发生了何种错误。本文中,我会介绍在
   你错了
   sql server 有接近3800个预定义错误代码,由主目录的sysmessages表维护。每一个错
误代码都有相应的精确的级别,该级别大致描述了错误。错误定义的级别从0到25。20以上的
错误代表重大错误,通常意味着该错误会导致存储进程立刻终止,并且所有的客户连接都要重
新初始化。非关键性错误只是禁止掉当前运行的程序行,并继续执行。所有的错误代码都有预
   那么在得到这些信息后要做什么呢?在访问存储进程的时候发生错误,可以通过@@error
系统函数返回错误代码。通过查阅sysmessages 可以得到真实的错误信息和级别。
   错误处理基础
   假设有一个表叫做nonullsallowed,有两个字段field1 和 field2。都不能为空。下面的
   create procedure illegalinsert as
   insert nonullsallowed values (null, null)
   print 'error occurred'
   print @@error
   假设还有下面的进程:
   create procedure sampleprocedure
   as
   exec illegalinsert
   print @@error
   当通过query analyzer调用sampleprocedure的时候,错误就会发生。
   server: msg 515, level 16, state 2, procedure illegalinsert, line 2
   cannot insert the value null into column 'field2', table
   'tempdb.dbo.nonullsallowed'; column does not allow s. insert fails.
   the statement has been terminated.
   error occurred
   0
   0
   这个小试验可以告诉你一些事情
   @@error函数仅仅返回错误代码
   如果@@error返回0,则没有错误。
   导致非重大错误的语句会被跳过,进程会继续执行下一个语句。
   基本策略
   由这三点,可以设计策略。现实中,实际的情况是几乎不可能制定策略,但是从某个角度
   检查存储进程中的每一行有些不切实际,所以应该检查那些关键的地方,比如关键性语句
   如过后继语句依赖前面的语句,检测到错误后需要手动的终止进程。
   依赖访问提供者通知客户错误。
   产生错误
   raiseerror可以产生定制的错误信息或者编号返回给客户端。下面是rasieerror的语法,
表a是各个参数的解释。

  raiserror ({msg_id|msg_str}{, severity, state}

  [argument [,…n]])
   [with option [, …n]]
   首先可以利用的raiseerror产生预定义错误代码。raiseerror接收13000以上的错误代码
   实际上,raiserror更多的用来发送定制错误信息。如同图a所示,msg_str标识符可以包
任意的错误信息,也就是说raiserror可以将特定的错误信息返回给客户。
   定制错误信息
   当然,大多数情况下,错误信息会使用多次,一遍一遍的输入相同的信息显然部理智。使
用sp_addmessage 存储过程将定制错误信息添加到sysmessages 表里。以后,在使用
   定制错误信息的标识号必须大于等于50000,信息本身的长度不能超过255个字符。下面
是例子,创建新的信息,赋予识别号55555,级别为10,sp_addmessage
   存储进程需要这样调用。
   sp_addmessage 55555, 10, 'new error message.'
   你可以在存储进程中增加提交新的错误:
   raiserror 55555, 10
   不难,只是不同
   创建带有错误检测的存储进程并不难,仅仅是和大多数可能会用到的不同而已。只需要一
个好的计划和相关的知识,可以可以很容易的使用他。

 国内最大的酷站演示中心!
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表