为什么这没有捕获存储过程中的错误?

时间:2019-04-21 19:43:40

标签: sql sql-server stored-procedures

SQL Server 2014(v12.0.5546)-我有一个“主”存储过程,我从中运行许多其他过程。如果出了一个错误,我希望它打印一行说明。

我今天运行了它,主存储过程中的一个存储过程返回了一个错误,指出我尝试的表插入变量数量错误,但没有显示错误。

我认为如果成功,存储过程将返回0,因此除此以外的任何其他操作都将意味着错误。我错了吗,或者我的程序有缺陷吗?

仅供参考,如果遇到错误,我不需要它停止运行,我只需要它吐出错误消息,这样我就知道它在哪里失败了。一切都说完了,这将增长到20-30个存储过程。

这是主存储过程:

findfirst

2 个答案:

答案 0 :(得分:1)

  

我认为如果成功,存储过程将返回0,因此除此以外的任何其他操作都将意味着错误。我错了吗,或者我的程序有缺陷吗?

存储过程返回您告诉它们的任何值。如果没有return语句,则它们返回成功0

通常接受的做法是,成功返回0,失败返回错误代码。但这不是强制性的。

您指的是用户存储过程。您需要调查它们在您的环境中如何工作。

我还建议您将存储过程的主体放在begin / end块中。

答案 1 :(得分:0)

  

主存储过程中返回的一个存储过程   一个错误,说我正在尝试的表插入有错误   数量的变量,但没有显示错误。

这似乎是编译错误。编译错误后将不会设置返回代码,因此分配的变量将保持不变。例如:

CREATE PROC dbo.ExampleCompilationError
AS
SELECT * FROM dbo.ThisTableDoesNotExist;
GO

DECLARE @rc int = NULL;
EXEC @rc = dbo.ExampleCompilationError;
SELECT @rc;
GO

此代码的返回代码仍为NULL

您可以用TRY / CATCH包围每个proc执行,这将在内部范围内捕获编译错误和执行时间错误:

BEGIN TRY
    EXEC dbo.ExampleCompilationError;
END TRY
BEGIN CATCH
    PRINT 'ExampleCompolationError failed';
END CATCH;
相关问题