自定义模板的SQL Server事务



我会问一个基础的东西,我将使用本地事务的东西回滚一堆表,如果一些条件被验证。

我真的必须检查基于一些存储过程的更新结果,这些存储过程从由输入报告填充的表中收集数据,更改太少或更改太多意味着回滚,因为我们将拒绝报告。我想用T-SQL的本地事务实现这个特性,这是我的一个伪想法:

CREATE PROCEDURE mytest 
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
EXEC foo
EXEC bar
EXEC baz
END TRY
IF true
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
END

当然,这不起作用是因为关键字'IF'附近的语法不正确,可能是因为它不是使用事务的正确方式。

我将考虑如何计算表的变化,如果需要使用临时表或如果我可以使用一些SQL功能。我正在搜索文档或示例,但是我没有找到任何东西。

提示吗?

你的伪代码缺少一个catch块。下面是一个包含错误处理和其他改进的示例。

CREATE PROCEDURE mytest
AS
SET XACT_ABORT ON; --best practice with explict transactions in procs
BEGIN TRY
BEGIN TRAN;
EXEC foo;
EXEC bar;
EXEC baz;
IF (<your-validation-succeeded-condition-here>)
COMMIT;
ELSE
ROLLBACK;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;

问题,正如我在评论中提到的,不是IF...ELSE,而是你没有CATCHTRY...CATCH需要TRYaCATCH;不像IF...ELSE,它只能有IF

因此,您可能想要这样的内容:

CREATE PROCEDURE dbo.MyTest AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION MyTransaction;
BEGIN TRY
EXEC FOO;
EXEC BAR;
EXEC BAZ;
IF {Your Boolean Expression}
COMMIT TRANSACTION MyTransaction;
ELSE
ROLLBACK TRANSACTION MyTransaction;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION MyTransaction;
THROW;
END CATCH;
END;

最新更新