如果任何语句失败,将回滚的 SQL 查询

标签 sql sql-server-2008 exception-handling

我想编写一个执行多个单独 SQL 语句的 SQL 脚本;如果这些语句中的任何一个失败,我想回滚整个事务。所以,像这样:

BEGIN TRANSACTION

insert into TestTable values (1)
insert into TestTable values (2)
insert into TestTabe values (3)

--if any of the statements fail
ROLLBACK
--else
COMMIT

这是针对 MS SQL 2008 的。有什么我可以做的吗?也许某种异常处理?

我意识到在我的示例中,我可以检查 TestTable 中的这些值并确定语句是否以这种方式失败。但实际上,我的 SQL 会复杂得多,我宁愿不知道 SQL 在做什么。

最佳答案

SQL Server 自 2005 年起就有异常支持:

BEGIN TRY
    BEGIN TRAN

    INSERT INTO ...

    COMMIT TRAN
END TRY
BEGIN CATCH
    EXECUTE usp_LogAndRethrowError
END CATCH

然后,您的 LogAndRethrowError 可以回滚任何注定失败的事务,例如:
-- Make sure we are not in a live or 'doomed' transaction
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION

关于如果任何语句失败,将回滚的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238881/

相关文章:

sql - 具有基于滞后条件的 Oracle SQL ROW_NUMBER() 窗口

sql - 每个 SELECT 语句都需要 FROM 子句

SQL 数据库架构 - 多对多或数据透视表

c++ - 如何抛出好的异常?

python - 检查 MySQL 列 Python 中的值是否来自列表

sql-server-2008 - BULK INSERT 还是导入和导出数据向导?

sql-server-2008 - 如何获取 SQL Server 2008 数据库的 SQL 转储?

sql - 在 SQL Server 2008 中添加列会锁定表吗?

python - 为什么在使用绝对路径执行时 Python 不从引发的异常中退出?

java - 如果没有抛出异常则返回 boolean true 表示操作成功?