Search code examples
sql-server-2008t-sqlrollback

TRY/CATCH not working when table goes missing


I can't seem to get this to work... The result is SQL Management Studio seems to hang, gives me the message

Msg 208, Level 16, State 1, Line 76 Invalid object name

If I try to close the code window, I get a warning that the transaction isn't committed, and asks if I would like to commit it. If I do, the truncate has happened, and the items are missing.

I'm trying to make sure the truncate does NOT happen or gets rolled back if the table in the "INSERT" statement is missing.

BEGIN 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
BEGIN CATCH
  if (@@TRANCOUNT > 0)
    ROLLBACK

END CATCH

Solution

  • Based on the information provided it looks like it may be a problem with your syntax, but it is unclear without a CREATE TABLE statement and some working code. It could also be that you're not checking if the table exists before the SELECT. I just tested the below and it has the desired results.

    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
    

    Or to avoid the TRY/CATCH use IF EXISTS to check if the table exists before starting anything.

    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
    

    Hope this helps!