CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

存储过程的错误处理

楼主Ganzl(甘逐浪)2002-03-29 12:52:26 在 MS-SQL Server / 基础类 提问

存储过程怎样来设置能够避免应用程序比存储过程先扑获SQL   SERVER系统错误,从而由存储过程来完成对系统错误的处理后在返回给应用程序。 问题点数:200、回复次数:7Top

1 楼nononono(null,null)回复于 2002-03-29 13:10:18 得分 40

以前讨论过,不好找,只找到下面这个有点用:  
   
  http://www.csdn.net/expert/topic/193/193330.xml?temp=.5391199  
  Top

2 楼N_chow(Yukon)回复于 2002-03-29 13:37:09 得分 40

毫無辦法,當SP在運行時遇到一個***Fatal***級時錯誤時,整個批次都會終止。  
  Top

3 楼Haiwer(海阔天空)回复于 2002-03-29 13:45:11 得分 40

有些错误如主键冲突,外键冲突等,在执行的时候就跳出了SP没法用@@error来得到错误,好象没有好方法。  
  Top

4 楼TNT1900(不顶事)回复于 2002-03-29 14:00:00 得分 40

@@ERROR  
  返回最后执行的   Transact-SQL   语句的错误代码。  
   
  语法  
  @@ERROR  
   
  返回类型  
  integer  
   
  注释  
  当   Microsoft®   SQL   Server™   完成   Transact-SQL   语句的执行时,如果语句执行成功,则   @@ERROR   设置为   0。若出现一个错误,则返回一条错误信息。@@ERROR   返回此错误信息代码,直到另一条   Transact-SQL   语句被执行。您可以在   sysmessages   系统表中查看与   @@ERROR   错误代码相关的文本信息。  
   
  由于   @@ERROR   在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。  
   
  示例  
  A.用   @@ERROR   检测一个特定错误  
  下面的示例用   @@ERROR   在一个   UPDATE   语句中检测限制检查冲突(错误   #547)。  
   
  USE   pubs  
  GO  
  UPDATE   authors   SET   au_id   =   '172   32   1176'  
  WHERE   au_id   =   "172-32-1176"  
   
  IF   @@ERROR   =   547  
        print   "A   check   constraint   violation   occurred"  
   
  B.用   @@ERROR   有条件地退出一个过程  
  在此示例中,IF...ELSE   语句在存储过程中的   INSERT   语句后检测   @@ERROR。@@ERROR   变量的值将决定传给调用程序的返回值,以指示此过程的成功与失败。  
   
  USE   pubs  
  GO  
   
  --   Create   the   procedure.  
  CREATE   PROCEDURE   add_author    
  @au_id   varchar(11),@au_lname   varchar(40),  
  @au_fname   varchar(20),@phone   char(12),  
  @address   varchar(40)   =   NULL,@city   varchar(20)   =   NULL,  
  @state   char(2)   =   NULL,@zip   char(5)   =   NULL,  
  @contract   bit   =   NULL  
  AS  
   
  --   Execute   the   INSERT   statement.  
  INSERT   INTO   authors  
  (au_id,     au_lname,   au_fname,   phone,   address,    
    city,   state,   zip,   contract)   values  
  (@au_id,@au_lname,@au_fname,@phone,@address,  
    @city,@state,@zip,@contract)  
   
  --   Test   the   error   value.  
  IF   @@ERROR   <>   0    
  BEGIN  
        --   Return   99   to   the   calling   program   to   indicate   failure.  
        PRINT   "An   error   occurred   loading   the   new   author   information"  
        RETURN(99)  
  END  
  ELSE  
  BEGIN  
        --   Return   0   to   the   calling   program   to   indicate   success.  
        PRINT   "The   new   author   information   has   been   loaded"  
        RETURN(0)  
  END  
  GO  
   
  C.用   @@ERROR   检测几条语句的成功  
  下面的示例取决于   INSERT   和   DELETE   语句的成功操作。局部变量在两条语句后均被设置为   @@ERROR   的值,并且用于此操作的共享错误处理例程中。  
   
  USE   pubs  
  GO  
  DECLARE   @del_error   int,   @ins_error   int  
  --   Start   a   transaction.  
  BEGIN   TRAN  
   
  --   Execute   the   DELETE   statement.  
  DELETE   authors  
  WHERE   au_id   =   '409-56-7088'  
   
  --   Set   a   variable   to   the   error   value   for    
  --   the   DELETE   statement.  
  SELECT   @del_error   =   @@ERROR  
   
  --   Execute   the   INSERT   statement.  
  INSERT   authors  
        VALUES('409-56-7008',   'Bennet',   'Abraham',   '415   658-9932',  
        '6223   Bateman   St.',   'Berkeley',   'CA',   '94705',   1)  
  --   Set   a   variable   to   the   error   value   for    
  --   the   INSERT   statement.  
  SELECT   @ins_error   =   @@ERROR  
   
  --   Test   the   error   values.  
  IF   @del_error   =   0   AND   @ins_error   =   0  
  BEGIN  
        --   Success.   Commit   the   transaction.  
        PRINT   "The   author   information   has   been   replaced"          
        COMMIT   TRAN  
  END  
  ELSE  
  BEGIN  
        --   An   error   occurred.   Indicate   which   operation(s)   failed  
        --   and   roll   back   the   transaction.  
        IF   @del_error   <>   0    
              PRINT   "An   error   occurred   during   execution   of   the   DELETE    
              statement."    
   
        IF   @ins_error   <>   0  
              PRINT   "An   error   occurred   during   execution   of   the   INSERT    
              statement."    
   
        ROLLBACK   TRAN  
  END  
  GO  
   
  D.   与   @@ROWCOUNT   一同使用   @@ERROR  
  下面的示例用   @@ERROR   和   @@ROWCOUNT   验证一条   UPDATE   语句的操作。为任何可能出现的错误而检验   @@ERROR   的值,而用   @@ROWCOUNT   保证更新已成功应用于表中的某行。  
   
  USE   pubs  
  GO  
  CREATE   PROCEDURE   change_publisher  
  @title_id   tid,    
  @new_pub_id   char(4)    
  AS  
   
  --   Declare   variables   used   in   error   checking.  
  DECLARE   @error_var   int,   @rowcount_var   int  
   
  --   Execute   the   UPDATE   statement.  
  UPDATE   titles   SET   pub_id   =   @new_pub_id    
  WHERE   title_id   =   @title_id    
   
  --   Save   the   @@ERROR   and   @@ROWCOUNT   values   in   local    
  --   variables   before   they   are   cleared.  
  SELECT   @error_var   =   @@ERROR,   @rowcount_var   =   @@ROWCOUNT  
   
  --   Check   for   errors.   If   an   invalid   @new_pub_id   was   specified  
  --   the   UPDATE   statement   returns   a   foreign-key   violation   error   #547.  
  IF   @error_var   <>   0  
  BEGIN  
        IF   @error_var   =   547  
        BEGIN  
              PRINT   "ERROR:   Invalid   ID   specified   for   new   publisher"  
              RETURN(1)  
        END  
        ELSE  
        BEGIN  
              PRINT   "ERROR:   Unhandled   error   occurred"  
              RETURN(2)  
        END  
  END  
   
  --   Check   the   rowcount.   @rowcount_var   is   set   to   0    
  --   if   an   invalid   @title_id   was   specified.  
  IF   @rowcount_var   =   0    
  BEGIN  
        PRINT   "Warning:   The   title_id   specified   is   not   valid"  
        RETURN(1)  
  END  
  ELSE  
  BEGIN  
        PRINT   "The   book   has   been   updated   with   the   new   publisher"  
        RETURN(0)  
  END  
  GO  
  Top

5 楼TNT1900(不顶事)回复于 2002-03-29 14:03:09 得分 40

使用   @@ERROR  
  如果最后的   Transact-SQL   语句执行成功,则   @@ERROR   系统函数返回   0;如果此语句产生错误,则   @@ERROR   返回错误号。每一个   Transact-SQL   语句完成时,@@ERROR   的值都会改变。  
   
  因为每个   Transact-SQL   语句执行完毕时,@@ERROR   都会得到一个新的值,@@ERROR   可用以下两种方法处理:    
   
  在   Transact-SQL   语句后,马上检测或使用   @@ERROR。  
   
   
  在   Transact-SQL   语句完成后,马上把   @@ERROR   存储到一个整型变量中。此变量的值可供以后使用。    
  在生成错误的批处理、存储过程或触发器中,@@ERROR   是   Microsoft&reg;   SQL   Server&#8482;   2000   错误的唯一可用部分。错误的所有其它部分,如严重度、状态、包含替换字符串(如对象名称)的消息文本,都只返回到那些能够用   API   错误处理机制进行错误处理的应用程序中。同时,@@ERROR   只由错误产生,而不由警告产生;因此,批处理、存储过程和触发器对于那些可能已经产生了的警告没有可见性。  
   
  @@ERROR   通常用于表示存储过程的成功或失败。整型变量初始化为   0。完成每个   Transact-SQL   语句后,都要测试   @@ERROR   是否为   0。如果   @@ERROR   不是   0,将被存储在变量中。存储过程然后在   RETURN   语句中返回变量。如果过程中的   Transact-SQL   语句都没有错误,变量保持为   0。如果一个或多个语句生成错误,则变量包含最后的错误号。下面是有此逻辑的简单存储过程:  
   
  USE   Northwind  
  GO  
   
  DROP   PROCEDURE   SampleProcedure  
  GO  
  --   Create   a   procedure   that   takes   one   input   parameter  
  --   and   returns   one   output   parameter   and   a   return   code.  
  CREATE   PROCEDURE   SampleProcedure   @EmployeeIDParm   INT,  
                          @MaxQuantity   INT   OUTPUT  
  AS  
  --   Declare   and   initialize   a   variable   to   hold   @@ERROR.  
  DECLARE   @ErrorSave   INT  
  SET   @ErrorSave   =   0  
   
  --   Do   a   SELECT   using   the   input   parameter.  
  SELECT   FirstName,   LastName,   Title  
  FROM   Employees  
  WHERE   EmployeeID   =   @EmployeeIDParm  
   
  --   Save   any   non-zero   @@ERROR   value.  
  IF   (@@ERROR   <>   0)  
          SET   @ErrorSave   =   @@ERROR  
   
  --   Set   a   value   in   the   output   parameter.  
  SELECT   @MaxQuantity   =   MAX(Quantity)  
  FROM   [Order   Details]  
   
  --   Save   any   non-zero   @@ERROR   value.  
  IF   (@@ERROR   <>   0)  
          SET   @ErrorSave   =   @@ERROR  
   
  --   Returns   0   if   neither   SELECT   statement   had  
  --   an   error,   otherwise   returns   the   last   error.  
  RETURN   @ErrorSave  
  GO  
   
  也有   @@ERROR   与   @@ROWCOUNT   一起使用的时候。在以下的示例中,@@ERROR   用于确定是否出现违反约束的错误,而   @@ROWCOUNT   则在一些行被成功更改的情况下,用于确定由   UPDATE   语句修改的行数。  
   
  BEGIN   TRAN  
      UPDATE   Northwind.dbo.Products  
      SET   UnitPrice   =   UnitPrice   *   1.1  
      WHERE   CategoryID   IN   (1,   2,   5,   6)  
       
  IF   @@ERROR   =   547  
      PRINT   'A   CHECK   CONSTRAINT   violation   occurred'  
  IF   @@ROWCOUNT   =   0    
      PRINT   'No   rows   updated.'  
  ELSE  
      PRINT   STR(@@ROWCOUNT)   +   '   rows   updated.'  
  COMMIT   --   Commits   rows   successfully   updated.  
   
  Top

6 楼mmzxg(超级笨蛋)回复于 2002-03-29 14:13:16 得分 0

学习Top

7 楼Ganzl(甘逐浪)回复于 2002-03-29 17:49:02 得分 0

谢谢各位的回复!阶段  
  来者有分Top

相关问题

  • 存储过程 错误处理
  • 存储过程错误处理,(高手请进)
  • 请问如何做错误处理在存储过程里面?
  • 存储过程中错误处理得问题
  • 如何在存储过程中处理错误
  • 存储过程的错误????
  • 存储过程错误
  • 棘手问题:如何在存储过程中进行错误捕捉和错误处理???
  • (ADO)--执行存储过程的错误
  • 存储过程的错误在哪里?

关键词

  • 语句
  • 存储过程
  • 执行
  • 检测
  • 应用程序
  • 代码
  • 错误
  • rowcount
  • 变量
  • error

得分解答快速导航

  • 帖主:Ganzl
  • nononono
  • N_chow
  • Haiwer
  • TNT1900
  • TNT1900

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo