频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

在SQL Server的存储过程中处理错误

来源: 作者: 出处:巧巧读书 2006-07-26 进入讨论组

  SQL Server 存储进程中的“错误处理”只是向客户端返回错误,通常访问提供者可以自己做。但是至少你可以知道在执行T-SQL的时候何止发生了何种错误。本文中,我会介绍在SQL Server 中监测和处理存储进程错误。
  
  你错了
  SQL Server 有接近3800个预定义错误代码,由主目录的sysmessages表维护。每一个错误代码都有相应的精确的级别,该级别大致描述了错误。错误定义的级别从0到25。20以上的错误代表重大错误,通常意味着该错误会导致存储进程立刻终止,并且所有的客户连接都要重新初始化。非关键性错误只是禁止掉当前运行的程序行,并继续执行。所有的错误代码都有预定义的解释。
  
  那么在得到这些信息后要做什么呢?在访问存储进程的时候发生错误,可以通过@@ERROR系统函数返回错误代码。通过查阅sysmessages 可以得到真实的错误信息和级别。
  
  错误处理基础
  假设有一个表叫做NoNullsAllowed,有两个字段Field1 和 Field2。都不能为空。下面的存储进程会更新NoNullsAllowed 表:
  
  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 nulls. INSERT fails.
  The statement has been terminated.
  Error occurred
  0
  0
  
  这个小试验可以告诉你一些事情
  
  @@ERROR函数仅仅返回错误代码
  如果@@ERROR返回0,则没有错误。
  导致非重大错误的语句会被跳过,进程会继续执行下一个语句。
  基本策略
  由这三点,可以设计策略。现实中,实际的情况是几乎不可能制定策略,但是从某个角度来说,某些环境下还是可以实现的:
  
  检查存储进程中的每一行有些不切实际,所以应该检查那些关键的地方,比如关键性语句,容易发生错误的地方。
  如过后继语句依赖前面的语句,检测到错误后需要手动的终止进程。
  依赖访问提供者通知客户错误。
  产生错误
  RAISEERROR可以产生定制的错误信息或者编号返回给客户端。下面是RASIEERROR的语法,表A是各个参数的解释。
  
  在SQL Server的存储过程中处理错误
  
  RAISERROR ({msg_id|msg_str}{, severity, state}
  [argument [,…n]])
  [WITH option [, …n]]
  
  首先可以利用的RAISEERROR产生预定义错误代码。RAISEERROR接收13000以上的错误代码,排除了几个可能的一般错误。
  
  实际上,RAISERROR更多的用来发送定制错误信息。如同图A所示,msg_str标识符可以包任意的错误信息,也就是说RAISERROR可以将特定的错误信息返回给客户。
  
  定制错误信息
  当然,大多数情况下,错误信息会使用多次,一遍一遍的输入相同的信息显然部理智。使用sp_addmessage 存储过程将定制错误信息添加到sysmessages 表里。以后,在使用RAISERROR 时候就可以引用新的信息ID号。
  
  定制错误信息的标识号必须大于等于50000,信息本身的长度不能超过255个字符。下面是例子,创建新的信息,赋予识别号55555,级别为10,sp_addmessage
  
  存储进程需要这样调用。
  
  sp_addmessage 55555, 10, 'New error message.'
  
  你可以在存储进程中增加提交新的错误:
  
  RAISERROR 55555, 10
  
  不难,只是不同
  创建带有错误检测的存储进程并不难,仅仅是和大多数可能会用到的不同而已。只需要一个好的计划和相关的知识,可以可以很容易的使用他。巧 巧 读 书:http://www.qqread.com/network/server/e443178181.html 更多文章 更多内容请看SQL Server 数据处理专题SQL Server 索引和查询专题SQL Server专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章