2011-09-18 117 views
0

我有10個存儲過程。存儲過程和錯誤處理

例如 -

  • 存儲過程從表中提取出的行的

然後存儲過程運行,然後第三...

我該怎麼辦錯誤處理在此。 。例如,我必須檢查第一個存儲過程是否成功運行,否則第二個拋出錯誤。如果第一次執行成功運行第二次存儲過程,如果第二次運行成功運行第三次否則拋出錯

ALTER PROCEDURE [dbo].[MASTER_PROCEDURE] AS 
EXEC QRY_STEP3 
EXEC QRY_STEP_3_1_1 
EXEC OQRY_STEP_3_1_1 
+0

存儲過程返回什麼?例如,如果他們的結果集,你可以檢查@@ Rowcount,如果爲0,則假定程序出錯。取決於你使用的是什麼版本的SQL,你也可以使用TRY Catch。你能提供你的SQL版本號和每個程序做什麼或返回的一般概念嗎? – Sparky

+0

他們創建臨時表和在第一個存儲過程中創建的臨時表用於第二個存儲過程 – CPDS

+0

您可以在調用後續過程之前檢查臨時表是否存在。用不同的方式做這件事,你使用什麼版本的SQL(即運行SELECT @@ VERSION並查看它返回的內容)。 – Sparky

回答

0

使用@@ ERROR。可以這樣

ALTER PROCEDURE [dbo].[MASTER_PROCEDURE] AS 

EXEC QRY_STEP3 

IF @@error =0 

begin 

EXEC QRY_STEP_3_1_1 

else 

begin 

print "error in proc name" 

return 1 

End 

if (@@error=0) 

Begin 

EXEC OQRY_STEP_3_1_1 

Else 

print "error in proc name" 

return 1 

End 

END 

END 
1

來完成我想補充的邏輯到每個存儲過程的子公司,以確定它們是否成功與否。例如測試是否存在臨時表。然後使用返回值來指示proc的成功。通常情況下,對於成功而言,這將爲0,對於失敗則爲非零。

你可以這樣調用特效由你做主PROC這樣

DECLARE @ReturnValue INT 

EXEC @ReturnValue = QRY_STEP1 

IF(@ReturnValue = 0) 
BEGIN 
    EXEC @ReturnValue = QRY_STEP2 
END 
ELSE 
BEGIN 
    --REPORT ERROR 
END 

使用這種方法,你的主人PROC犯規需要了解每個孩子PROC的內部運作,和你的主人PROC代碼會更清潔,更具可讀性。

0

首先要正確地做到這一點,您應該在子包中使用TRY CATCH塊。如果有錯誤,那些應該返回到調用過程。這樣,如果結果是意外的,您也可以將錯誤代碼返回給調用過程,例如具有零記錄的臨時表,該記錄不是錯誤,但可能會導致後續過程失敗。

接下來,你爲什麼要使用子進程?老實說,這可能是一個過程中更好的做法。你說例如你在一個proc中創建臨時表,你在隨後的過程中使用。爲此,您需要全局臨時表。問題是全局臨時表並不是特定於調用它們的原始連接,因此兩個試圖同時這樣做的人可能會混淆他們的數據。而如果你使用一個不可能發生的proc和local temp表。