SQL Try-Catch和事务问题

时间:2012-11-12 15:12:32

标签: sql tsql transactions

我有这样的交易,我有几个问题。

如果我在“Master”上运行此操作,那么它应该出错,因为表'Year'不存在我没有看到事务回滚。 SQL只会抛出表/列不存在的错误。

如果我针对表存在的数据库运行它并因为外键约束而使其出错,那么我确实看到了事务回滚。

为什么我得不到相同的结果。

BEGIN TRY
    BEGIN TRANSACTION

    INSERT INTO Year (YearId, FiscalYear) 
    VALUES (NewId(), 2014)

    COMMIT

END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
     ROLLBACK
        PRINT 'ERROR'

  DECLARE @ErrMsg nvarchar(4000)
        , @ErrSeverity int
  SELECT @ErrMsg = ERROR_MESSAGE(),
         @ErrSeverity = ERROR_SEVERITY()

  RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

GO

1 个答案:

答案 0 :(得分:6)

我猜想当表不存在时,在解析/编译代码并且从不执​​行代码时会发生错误,因此没有要回滚的事务。

当表存在时,必须执行代码并启动事务。然后该错误导致回滚。