只为成功找方向,不为失败找借口

每天都不能停止前进的脚步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

存储过程中的错误处理

Posted on 2010-01-21 11:17  冰碟  阅读(465)  评论(0编辑  收藏  举报

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

 

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

 

代码
CREATE TABLE testTable
(
    id 
int IDENTITY(1,1),
    name 
nvarchar(20NOT NULL,
    pass 
nvarchar(20)
)

CREATE PROCEDURE testTableInsert

    
@name nvarchar(20),
    
@pass nvarchar(20)

AS

    
BEGIN TRY
        
INSERT INTO testTable
        
VALUES(@name,@pass)
    
END TRY
    
BEGIN CATCH
        
PRINT @@error
        
PRINT 'error'        
    
END CATCH
    
    
SELECT * FROM Test--(怎是存在的表)
    
    

EXEC testTableInsert null,'test'

 

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

 

代码
--下面演示了SQL错误处理的脆弱性   
    
  
--测试的存储过程1   
  create   proc   p1   
  
as   
  
print   12/0   
  
if   @@error<>0   
  
print   'error 1'   
    
  
select   *   FROM SwcPage 
  
if   @@error<>0   
  
print   'error 2'   
  
go   
    
  
--调用   
  exec   p1   
  
go   
    
  
--删除测试   
  drop   proc   p1   
    
  
/*--测试结果   
    
  服务器:   消息   8134,级别   16,状态   1,过程   p1,行   6   
  遇到被零除错误。   
  发生错误1   
  服务器:   消息   208,级别   16,状态   1,过程   p1,行   10   
  对象名   'newid'   无效。   
    
  --
*/   
代码
--下面演示了SQL错误处理的脆弱性   
    
  
--演示2,存储过程嵌套调用中的错误   
    
  
--测试的存储过程1   
  create   proc   p1   
  
as   
  
print   12/0   
  
if   @@error<>0   
  
print   'error 1'   
    
  
select   *   from   newid()   
  
if   @@error<>0   
  
print   'error 2'   
  
go   
    
  
--测试的存储过程2   
  create   proc   p2   
  
as   
  
exec   p1   
    
  
if   @@error<>0   
  
print   'call sp1 error end'   
  
else   
  
print   'call sp1 normal end'   
  
go   
    
  
--调用   
  exec   p2   
  
go   
    
  
--删除测试   
  drop   proc   p1,p2   
    
  
/*--测试结果   
    
  服务器:   消息   8134,级别   16,状态   1,过程   p1,行   8   
  遇到被零除错误。   
  发生错误1   
  服务器:   消息   208,级别   16,状态   1,过程   p1,行   12   
  对象名   'newid'   无效。   
  调用   存储过程1   异常结束   
  --
*/