存储过程中的错误处理

如果存储过程执行中遇到了错误(严重错误),就会终止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   异常结束   
  --
*/   

原文地址:https://www.cnblogs.com/icebutterfly/p/1653114.html