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

 

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

 

.net ef6.0执行存储过程 执行存储过程错误_存储过程

.net ef6.0执行存储过程 执行存储过程错误_.net ef6.0执行存储过程_02

代码

CREATE TABLE testTable
(
    id int IDENTITY(1,1),
    name nvarchar(20) NOT 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(邹建))

 

.net ef6.0执行存储过程 执行存储过程错误_存储过程

.net ef6.0执行存储过程 执行存储过程错误_.net ef6.0执行存储过程_02

代码

--下面演示了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'   无效。   
    
  --*/

.net ef6.0执行存储过程 执行存储过程错误_存储过程

.net ef6.0执行存储过程 执行存储过程错误_.net ef6.0执行存储过程_02

代码

--下面演示了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   异常结束   
  --*/