2015-02-10 45 views
-2

我有一个即使存在一些错误也需要运行的存储过程。所以这里一个小exameple即使存在错误,也要保持存储过程运行

CREATE PROCEDURE FirstProcedure 
@SomeParams 

AS BEGIN 


Declare Db_Cursor Cursor For 
Select * From #TmpR 
Open Db_Cursor 
Fetch Next From Db_cursor Into 
@SomaValues 
While @@Fetch_Status = 0 
    Begin 
    set @ERR = 0 
    exec [SecondProcedure] @SomaValues 
    set @ERR = @@ERROR 

    if @ERR <> 0 begin 
     -- do some things in case of error 
    end 
    Fetch Next From Db_Cursor Into 
@SomaValues 

    End 

END 

如果第二个过程的回报和错误我抓住它的@ERR变量,做一些其他的事情,但我想光标运行,直到表的末端,因为它不是非常重要,如果从100.000的2-3行不能使用SecondProcedure插入?

我该怎么办?

+0

,把被击中前的错误,只有当它的安全执行代码进行检查,一些防御性的代码。 – Tanner 2015-02-10 14:33:28

+0

你期待什么错误? – 2015-02-10 14:34:21

+0

在不可为空的列中插入null,截断的字符串等等。 – CiucaS 2015-02-10 14:34:59

回答

1

使用Try/Catch

CREATE PROCEDURE FirstProcedure 
@SomeParams 

AS BEGIN 


Declare Db_Cursor Cursor For 
Select * From #TmpR 
Open Db_Cursor 
Fetch Next From Db_cursor Into 
@SomaValues 
While @@Fetch_Status = 0 
    Begin 
    begin try 
     exec [SecondProcedure] @SomaValues 
    end try 
    begin catch 
     SELECT ERROR_NUMBER() AS ErrorNumber 
      ,ERROR_SEVERITY() AS ErrorSeverity 
      ,ERROR_STATE() AS ErrorState 
      ,ERROR_PROCEDURE() AS ErrorProcedure 
      ,ERROR_LINE() AS ErrorLine 
      ,ERROR_MESSAGE() AS ErrorMessage; 
    end catch 

    Fetch Next From Db_Cursor Into @SomaValues 
    End 
    close db_cursor 
    deallocate db_cursor 

END 
如果你希望有可能成为第二个存储过程的错误
+0

由于某种原因,它仍然停止并引发错误。我会再试一次。 – CiucaS 2015-02-10 14:54:14

+0

#tmpr有多少列?你也需要关闭和释放。 (我编辑我的答案为这一个) – RezaRahmati 2015-02-11 06:45:46

+0

错误可能是其他代码行。你会更新你的问题,并添加你得到的错误 – RezaRahmati 2015-02-11 06:47:33