>SQL Server 2014 (v12.0.5546( - 我有一个"主"存储过程,我从中运行了一堆其他存储过程。如果一个错误,我希望它打印一行说明这一点。
我今天运行了它,主存储过程中的一个存储过程返回了一个错误,指出我正在尝试的表插入具有错误数量的变量,但它没有打印错误。
我认为如果成功,存储过程将返回 0,因此除此之外的任何内容都意味着错误。是我错了,还是我的流程有缺陷?
仅供参考,如果遇到错误,我不需要它停止运行,我只需要它吐出错误消息,以便我知道它在哪里失败。 当一切都说完并完成时,这将增长到 20-30 个存储过程。
下面是主存储过程:
ALTER PROCEDURE [dbo].[Master_CreateLoadTables]
AS
DECLARE @retval INT
-- Builds all tables required for the stored procedures
EXEC @retval = [BuildTables]
IF (@retval) = 0
BEGIN
SET @retval = 1
EXEC @retval = [Load_CustomerLookup]
IF (@retval) <> 0
PRINT 'Load of Customer Lookup Table Failed'
EXEC @retval = [Load_CustomerInvoices]
IF (@retval) <> 0
PRINT 'Load of Customer Invoice Tables Failed'
EXEC @retval = [Load_Payments]
IF (@retval) <> 0
PRINT 'Load of Payments Table Failed'
END
ELSE
PRINT 'Table Creation Failed'
我认为如果成功,存储过程将返回 0,因此除此之外的任何内容都意味着错误。是我错了,还是我的流程有缺陷?
存储过程返回您告诉它们的任何值。如果没有返回语句,则返回成功,0
。
普遍接受的做法是返回 0 表示成功,返回错误代码表示失败。 但这并没有强制执行。
您指的是用户存储过程。您需要调查它们在您的环境中的工作方式。
我还鼓励您将存储过程的主体放在 begin
/end
块中。
返回的主存储过程中的存储过程之一 错误说我正在尝试的表格插入有误 变量的数量,但它没有打印错误。
这似乎是一个编译错误。编译错误后不会设置返回代码,因此分配的变量将保持不变。例如:
CREATE PROC dbo.ExampleCompilationError
AS
SELECT * FROM dbo.ThisTableDoesNotExist;
GO
DECLARE @rc int = NULL;
EXEC @rc = dbo.ExampleCompilationError;
SELECT @rc;
GO
返回代码仍与此代码NULL
。
你可以用 TRY/CATCH 包围每个进程执行,这将捕获内部范围内的编译错误和执行时间错误:
BEGIN TRY
EXEC dbo.ExampleCompilationError;
END TRY
BEGIN CATCH
PRINT 'ExampleCompolationError failed';
END CATCH;