在我的过程中,历史上,我总是发现一个异常,然后在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,谷歌和这个网站的例子,但没有包括ROLLBACK,所以这只是一个简单的问题,以确保绝对。
发布于 2014-01-06 21:58:25
仅对于抛出语句之前的record语句,应该用分号结束。但是通常情况下,您的方法是正确的-抛出结束批处理,因此必须是要在catch块中执行的最后一条语句。可以选择使用抛出参数:THROW [ { error_number | @local_variable }, { message | @local_variable }, { state | @local_variable } ] [ ; ]
https://stackoverflow.com/questions/20952017
复制相似问题