在我的历史过程中,我总是捕获异常,然后在 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
,所以这只是一个快速的问题,以确保绝对确定。
最佳答案
只是为了在THROW 语句之前的record 语句应该以分号结束。但通常您的方法是正确的 - THROW 结束批处理,因此必须是您要在 catch block 中执行的最后一条语句。您可以选择将 THROW 与参数一起使用:
抛出 [ { 错误编号 | @local_variable },
{ 留言 | @local_variable },
{ 状态 | @local_variable } ]
[ ; ]
关于sql-server - 用 THROW 替换 RAISERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952017/