我有一个更大的存储过程,它利用几个 TRY/CATCH 块来捕获和记录单个错误。我还围绕程序的全部内容包装了一个事务,以便能够在沿途某处出现错误的情况下回滚整个事情(以防止大量混乱的清理);XACT_ABORT 已启用,否则它不会回滚整个事务。
关键组件:
我的数据库中有一个表,每次运行此过程时都会插入一条记录,其中包含操作结果和问题的详细信息。
有趣的事情正在发生 - 实际上,当我终于弄清楚出了什么问题时,这很明显......我的日志表中的插入语句也正在回滚,因此,如果我没有在 SSMS 中运行它,我什至看不到这是否已运行,因为回滚会删除所有活动的恍惚状态。
问题:
除了这个单一的插入语句之外,是否有可能让整个事务回滚?我仍然想保留在存储过程运行期间编译的错误消息。
非常感谢!
~以利
更新 6/28
这是我正在查看的代码示例。这与@Alex 和@gameiswar 提出的样本之间的主要区别在于,在我的例子中,try/catch 块都嵌套在单个事务中。这样做的目的是有多个捕获(对于多个表),尽管即使最后一次更新失败,我们也会回滚整个混乱。
SET XACT_ABORT ON;
BEGIN TRANSACTION
DECLARE @message AS VARCHAR(MAX) = '';
-- TABLE 1
BEGIN TRY
UPDATE TABLE xx
SET yy = zz
END TRY
BEGIN CATCH
SET @message = 'TABLE 1 '+ ERROR_MESSAGE();
INSERT INTO LOGTABLE
SELECT
GETDATE(),
@message
RETURN;
END CATCH
-- TABLE 2
BEGIN TRY
UPDATE TABLE sss
SET tt = xyz
END TRY
BEGIN CATCH
SET @message = 'TABLE 2 '+ ERROR_MESSAGE();
INSERT INTO LOGTABLE
SELECT
GETDATE(),
@message
RETURN;
END CATCH
COMMIT TRANSACTION