1

このような取引があり、それについていくつか質問があります。

テーブル「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
4

1 に答える 1

6

テーブルが存在しない場合、コードが解析/コンパイルされて実行されないときにエラーが発生するため、ロールバックするトランザクションはないと思います。

テーブルが存在する場合、コードを実行する必要があり、トランザクションが開始されます。このエラーにより、ロールバックが発生します。

于 2012-11-12T15:16:07.190 に答える