我似乎无法让这个工作......结果是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
答案 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输出不再可用。
尽管如此,该事务仍被回滚,因为此后没有未完成的事务。
证明:
因此,我决定在脚本启动时/进行事务之前检查所需的表,而不是使用XACT_ABORT
。