SQL Server XACT_ABORT 排除

2023-12-06

我有一个更大的存储过程,它利用多个 TRY/CATCH 块来捕获并记录各个错误。我还在过程的整个内容周围封装了一个事务,以便能够在沿途某个地方发生错误时回滚整个过程(以防止大量混乱的清理); XACT_ABORT 已启用,否则它不会回滚整个事务。

关键部件:
我的数据库中有一个表,每次运行此过程时都会插入一条记录,其中包含操作结果和出错的详细信息。

有趣的事情正在发生 - 实际上,当我最终弄清楚出了什么问题时,很明显......日志表中的插入语句也被回滚,因此,如果我没有从 SSMS 中运行它,我将无法看到它是否已运行,因为回滚会删除所有活动痕迹。

问题:
除了这个单个插入语句之外,是否可以回滚整个事务?我仍然想保留在存储过程运行期间编译的错误消息。

非常感谢!

~Eli

更新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

您可以尝试如下所示的操作,这可确保您记录操作。这利用了表变量不会回滚的事实。

伪代码仅供参考:

create table test1
(
id int primary key
)

create table logg
(
errmsg varchar(max)
)



declare @errmsg varchar(max)

set xact_abort on
begin try
begin tran
insert into test1
select 1

insert into test1
select 1

commit
end try

begin catch
set @errmsg=ERROR_MESSAGE()
select @errmsg as "in block"
if @@trancount>0
rollback tran

end catch
set xact_abort off


select @errmsg as "after block";

insert into logg
select @errmsg


select * from logg
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server XACT_ABORT 排除 的相关文章

  • 比较 2 个 linq 应用程序:意外结果

    我起草了2 ASP NET应用程序 using LINQ 一个连接到微软SQL服务器 另一个对某些专有内存结构 这两个应用程序都可以使用以下表格3 个 int 字段 有500 000 条记录 内存结构与 SQL Server 表相同 使用的
  • 为什么 Sql Server 2000 上的 TSQL 对小数点的舍入不一致?

    我正在尝试计算美元金额的折扣百分比 在 50 的情况下 有时你会得到半分钱 我需要将其四舍五入到最接近的一分钱 在Sql中 我的计算如下 round retail 0 5 2 0 如果我采用以下值 我会得到不同的结果 4 39 2 49 不
  • VS C#/SQL Server Compact 安装故障排除 - “事件日志文件已满”消息

    我正在尝试开发一个小型 C 应用程序 使用 MS Visual Express 和 SQL Server 但在尝试找出弹出的错误对话框时遇到问题 事件日志文件已满 我正在遵循这些说明 http msdn microsoft com en u
  • SQL Server 存储过程对象名称无效

    我在尝试修改现有存储过程时收到此错误 Invalid object name dbo BackupDB 我能够创建此存储过程 但是当我单击修改选项来修改此存储过程时 系统显示了上述错误 您会看到所附图片 当尝试执行此命令时 我也遇到同样的错
  • 通过网络恢复数据库备份

    如何通过网络使用 SQL Server 2005 恢复数据库备份 我记得以前这样做过 但这样做的方式有些奇怪 您几乎没有选择使用网络文件作为备份源 在与 MS SQL Server 相同的用户下映射网络驱动器 路径 托管文件 使用 xp c
  • django pyodbc 数据源名称未找到

    当尝试连接到我的数据库服务器和 Django 中的数据库时 我收到错误 django db utils InterfaceError IM002 IM002 Microsoft ODBC Driver Manager 未找到数据源名称且未指
  • 将服务器添加到 SQL Management Studio

    我想将不同服务器上的一堆 SQL 2000 2005 的混合 服务器实例添加到我的 SSMS SQL Managment Studio 注册服务器 我正在遵循本教程here http sev17 com 2008 12 registerin
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • SQL 中的代码重用和模块化

    代码重用和模块化对于 SQL 存储过程编程来说是一个好主意吗 如果是这样 将这些功能添加到 SQL 存储过程代码库的最佳方法是什么 我通常为常见且重复的任务创建标量值函数 我发现它不仅可以简化与现有程序类似的新程序的开发 而且还有助于错误跟
  • 从 bak 文件恢复数据库 sql server 的脚本不起作用

    我有一个空数据库 DB Clients 我想从一个恢复数据库 bak file OldDBClients bak 这是路径 C OldDBClients bak 这是我的脚本 USE master GO RESTORE DATABASE D
  • TSQL - 执行CLR权限

    我从 CLR net Assembly 获得了一个 sql 过程 该过程在执行时返回错误 Msg 6522 Level 16 State 1 Procedure sp HelloWorld Line 0 A NET Framework er
  • 使用 AT TIME ZONE 获取指定时区的当前时间

    我正在尝试使用新的在 SQL Server 2016 和 Azure SQL 中 我只是想获取伦敦的当前时间datetime 针对夏令时进行调整 运行以下所有命令时 伦敦时间为凌晨 3 27 点 第一步是获得一个datetimeoffset
  • C# 查询两个数据库的数据

    我目前有一个查询 我正在从两个不同的数据库获取数据 这些数据被附加到一个名为 accountbuys 的列表中 我的第一个表有三个数据条目 3个想要购买股票的帐户 下一张表有 17 个数据点 购买 17 只股票 I am merging t
  • 解释 SQL Server 中 sys.objects 中的类型代码

    在 SQL Server 上 sys objects 表包含 Type 和 Type Desc 属性 例如 对于我的一个数据库 SELECT DISTINCT Type Type Desc FROM Sys Objects ORDER BY
  • 如何将 SQL 结果存入 STRING 变量?

    我正在尝试获取 C 字符串变量或字符串数 组中的 SQL 结果 是否可以 我需要以某种方式使用 SqlDataReader 吗 我对 C 函数和所有功能非常陌生 曾经在 PHP 中工作 所以如果可以的话请给出一个工作示例 如果相关 我已经可
  • 如何更新 SQL Server 2000 中的 text 或 ntext 字段

    所以我需要更新一个文本字段 在下面使用时 UPDATE 语句或 WRITETEXT 语句都不起作用 CREATE TABLE MyTable IDField int MyField text INSERT INTO MyTable IDFi
  • INFORMATION_SCHEMA 与 sysobjects

    在 SQL Server 中 INFORMATION SCHEMA 和 sysobjects 之间有什么区别 其中一个是否比另一个提供更多信息 或者它们通常用于不同的用途 sysobjects 与 sys objects 相同吗 如果不是
  • 插入后触发更新表列?

    在同一个表中添加任何记录后 我需要更新表中的列 这是我的sql代码 CREATE TRIGGER dbo EmployeeInsert ON dbo APP Employees AFTER INSERT AS BEGIN SET NOCOU
  • .NET:SqlDataReader.Close 或 .Dispose 导致超时过期异常

    当尝试在 SqlDataReader 上调用 Close 或 Dispose 时 我收到超时过期异常 如果您有到 SQL Server 的 DbConnection 您可以使用以下命令自行重现它 String CRLF r n String

随机推荐