在历史上我的程序中,我总是遇到异常,然后在ROLLBACK
之后提出异常。我在MSDN中看到推荐的方法(对于SQL2012 +)是THROW
。
基于此示例程序:
CREATE PROC my_procName
@id int
AS
BEGIN TRY
BEGIN TRAN
UPDATE [tbl_A] WHERE (ID=@id);
UPDATE [tbl_B] WHERE (fkID=@id);
UPDATE [tbl_C] WHERE (fkID=@id);
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
DECLARE @ErrMsg nvarchar(4000)
DECLARE @ErrSeverity int
SET @ErrMsg = ERROR_MESSAGE()
SET @ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
GO
这是抛出异常的正确方法,同时保留ROLLBACK
?
CREATE PROC my_procName
@id int
AS
BEGIN TRY
BEGIN TRAN
UPDATE [tbl_A] WHERE (ID=@id);
UPDATE [tbl_B] WHERE (fkID=@id);
UPDATE [tbl_C] WHERE (fkID=@id);
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
THROW
END CATCH
GO
我已经查看了MSDN,Google和此网站的示例,但没有一个包含ROLLBACK
,所以这只是一个快速的问题,可以绝对肯定。
答案 0 :(得分:2)
仅在THROW声明之前的记录声明应以分号结束。但通常你的方法是正确的 - 然后批处理结束批处理因此必须是你想要在catch块中执行的最后一个语句。您可以选择使用THROW参数:
THROW [ { error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable } ]
[ ; ]