2011-09-18 134 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表。