0

以下のコードのように、繰り返しでトランザクションを使用しようとしています。

    Declare @i int, @TRAN_NAME varchar(40)
Declare @TMPTABLE TABLE(pk int unique)
Set @i = 0

While @i < 5 Begin
      BEGIN TRY
            Set @TRAN_NAME = CONVERT(varchar(20), @i)
            BEGIN TRAN @TRAN_NAME
                  INSERT @TMPTABLE
                  VALUES(@i)
                  if @i = 3 Begin
                        INSERT @TMPTABLE
                        VALUES(@i)
                  End
            COMMIT TRAN @TRAN_NAME 
      END TRY
      BEGIN CATCH
            ROLLBACK TRAN @TRAN_NAME
            DECLARE @msg varchar(1000) = ERROR_MESSAGE() 

            RAISERROR(@msg,16,1)
      END CATCH
      Set @i = @i + 1
End

Select * from @TMPTABLE

問題は、以下のコードから取得したクエリが次の結果を返すことです。

pk
0
1
2
3
4

しかし、問題は、意図的に繰り返しに pk を挿入しようとしているので、コードのように値とその前に値を挿入したくないため、結果に 3 が含まれてはならないことです。トランザクションによってロールバックされますが、まだ 3 が挿入されます。

4

1 に答える 1

1

トランザクションはインメモリ テーブルには適用されません。一時テーブルを使用すると、#tmp期待どおりに機能します。

http://technet.microsoft.com/en-us/library/ms175010.aspxから

テーブル変数はスコープが限定されており、永続データベースの一部ではないため、トランザクション ロールバックの影響を受けません。

http://www.sqlservercentral.com/blogs/steve_jones/2010/09/21/table-variables-and-transactions/も参照してください。

于 2013-10-21T08:21:19.727 に答える