2015-02-10 71 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