博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

存储过程中的错误处理

Posted on 2013-10-30 10:44  米粒3  阅读(560)  评论(0编辑  收藏  举报

如果存储过程执行中遇到了错误(严重错误),就会终止sp的执行,但是如果想让sp跳过错误,继续执行后面的语句,怎么办?

 

1,在sql server 2005中可以用try...catch解决。

 

 

 

[c-sharp] view plaincopy
  1. CREATE TABLE testTable  
  2. (  
  3.     id int IDENTITY(1,1),  
  4.     name nvarchar(20) NOT NULL,  
  5.     pass nvarchar(20)  
  6. )  
  7. CREATE PROCEDURE testTableInsert  
  8.     @name nvarchar(20),  
  9.     @pass nvarchar(20)  
  10. AS  
  11.     BEGIN TRY  
  12.         INSERT INTO testTable  
  13.         VALUES(@name,@pass)  
  14.     END TRY  
  15.     BEGIN CATCH  
  16.         PRINT @@error  
  17.         PRINT 'error'          
  18.     END CATCH  
  19.       
  20.     SELECT * FROM Test--(怎是存在的表)  
  21.       
  22.       
  23. EXEC testTableInsert null,'test'  

 

 

 

2,sql server 2005之前,用sp嵌套的方法(来自zjcxc(邹建))

 

 

[c-sharp] view plaincopy
  1. --下面演示了SQL错误处理的脆弱性     
  2.       
  3.   --测试的存储过程1     
  4.   create   proc   p1     
  5.   as     
  6.   print   12/0     
  7.   if   @@error<>0     
  8.   print   'error 1'     
  9.       
  10.   select   *   FROM SwcPage   
  11.   if   @@error<>0     
  12.   print   'error 2'     
  13.   go     
  14.       
  15.   --调用     
  16.   exec   p1     
  17.   go     
  18.       
  19.   --删除测试     
  20.   drop   proc   p1     
  21.       
  22.   /*--测试结果    
  23.      
  24.   服务器:   消息   8134,级别   16,状态   1,过程   p1,行   6    
  25.   遇到被零除错误。    
  26.   发生错误1    
  27.   服务器:   消息   208,级别   16,状态   1,过程   p1,行   10    
  28.   对象名   'newid'   无效。    
  29.      
  30.   --*/     

 

 

 

[c-sharp] view plaincopy
  1. --下面演示了SQL错误处理的脆弱性     
  2.       
  3.   --演示2,存储过程嵌套调用中的错误     
  4.       
  5.   --测试的存储过程1     
  6.   create   proc   p1     
  7.   as     
  8.   print   12/0     
  9.   if   @@error<>0     
  10.   print   'error 1'     
  11.       
  12.   select   *   from   newid()     
  13.   if   @@error<>0     
  14.   print   'error 2'     
  15.   go     
  16.       
  17.   --测试的存储过程2     
  18.   create   proc   p2     
  19.   as     
  20.   exec   p1     
  21.       
  22.   if   @@error<>0     
  23.   print   'call sp1 error end'     
  24.   else     
  25.   print   'call sp1 normal end'     
  26.   go     
  27.       
  28.   --调用     
  29.   exec   p2     
  30.   go     
  31.       
  32.   --删除测试     
  33.   drop   proc   p1,p2     
  34.       
  35.   /*--测试结果    
  36.      
  37.   服务器:   消息   8134,级别   16,状态   1,过程   p1,行   8    
  38.   遇到被零除错误。    
  39.   发生错误1    
  40.   服务器:   消息   208,级别   16,状态   1,过程   p1,行   12    
  41.   对象名   'newid'   无效。    
  42.   调用   存储过程1   异常结束    
  43.   --*/