当表丢失时,TRY / CATCH不起作用

时间:2017-05-09 16:46:22

标签: sql-server-2008 tsql rollback

我似乎无法让这个工作......结果是SQL Management Studio似乎挂了,给我留言

  

消息208,级别16,状态1,行76无效的对象名称

如果我尝试关闭代码窗口,我会收到一条警告,指出事务没有提交,并询问我是否要提交它。如果我这样做,截断已经发生,并且项目丢失了。

我试图确保截断不会发生或者如果" INSERT"中的表格被回滚。陈述遗失。

TRY 
  BEGIN TRAN
    TRUNCATE TABLE X
    INSERT INTO TABLE X ([values...]) -- pseudo code; insert works fine if table is present
    SELECT * FROM  <potentially missing table>
  COMMIT TRAN
END TRY
CATCH
  if (@@TRANCOUNT > 0)
    ROLLBACK

END CATCH

2 个答案:

答案 0 :(得分:0)

根据提供的信息,它看起来可能是您的语法问题,但如果没有CREATE TABLE语句和一些工作代码则不清楚。也可能是您没有在SELECT之前检查表是否存在。我刚刚测试了下面的内容,它有所需的结果。

BEGIN TRY
  BEGIN TRAN
    TRUNCATE TABLE [test_table]
    INSERT INTO [test_table] VALUES ('...')
    SELECT * FROM [test_table]
  COMMIT
END TRY
BEGIN CATCH
  IF (@@TRANCOUNT > 0)
    PRINT N'rolling back transaction' --for confirmation of the catch
    ROLLBACK
END CATCH

或者为了避免TRY / CATCH使用IF EXISTS在开始之前检查表是否存在。

IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'test_table')
BEGIN
  BEGIN TRAN
    TRUNCATE TABLE [test_table]
    INSERT INTO [test_table] VALUES ('...')
    SELECT * FROM [test_table]
  COMMIT
END
ELSE
BEGIN
    -- do something else
    PRINT N'The table does not exist'
END

希望这有帮助!

答案 1 :(得分:0)

2020-10-11:

在进行交易之前,我尝试过SET XACT_ABORT ON。 有趣的是,当遇到丢失的表时(例如,在SELECT stmt处),脚本STILL暂停,而不会进入TRY/CATCH块。

而且,实际上更糟的是,所有先前的SQL输出不再可用。

尽管如此,该事务仍被回滚,因为此后没有未完成的事务。

证明:

  1. 执行“选择@@ TRANCOUNT”将返回0
  2. 手动执行“ ROLLBACK TRAN”状态:“ ROLLBACK TRANSACTION 请求没有相应的BEGIN TRANSACTION。”

因此,我决定在脚本启动时/进行事务之前检查所需的表,而不是使用XACT_ABORT