SQL返回错误代码与RaiseError
您好我正在写一个存储过程,将按小时计划执行一批作业,并且我正在尝试决定是返回错误还是提高它们。 假设我会记录每个工作内的错误,这会导致更好的性能和可维护性?
例如
- 带有错误代码
CREATE PROCEDURE Job1
AS
BEGIN
BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RETURN 1; --Return 1 for error
END CATCH
RETURN 0;
END
CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION;
DECLARE @Error INT;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
RETURN;
ErrorHandling:
IF @@TRANCOUNT > 0
ROLLBACK;
END
例如RaiseError
CREATE PROCEDURE Job1
AS
BEGIN
BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE());
END CATCH
END
CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
EXEC Job1;
EXEC Job1;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK;
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
后者似乎产生更多可维护的代码
关于编码风格,这可能是一个宗教问题。 返回码和异常之间的主要区别在于异常将继续传递给调用链。
通常,在我编写的代码中,我使用返回值将存储过程的状态作为“应用程序错误”返回。 和你的例子一样,0意味着成功,其他意味着失败。 每当我用真实代码调用存储过程时,我都会检查返回值以及可能出现的任何新错误。 顺便说一下,在SQL Server中,您不能使用“@retval <> 0”检查失败,因为存储过程可以返回NULL。
当然,异常/数据库错误仍然会发生。 这个想法是,当一个异常被识别时,它会被记录和处理。 系统“错误”变成应用程序错误。
我遇到的一个问题是与SQL Server Agent的交互。 为此,您想提出一个错误来“分叉”到错误处理步骤。 这很容易在作业步骤内完成,通过查看返回值然后生成错误。
链接地址: http://www.djcxy.com/p/11657.html上一篇: sql Return Error Codes vs RaiseError
下一篇: Android: determining if code should reside in activity or custom view