none
SQL語法請教 RRS feed

  • 問題

  •  請問各位:

     

    WHILE @counter < @targetNo
      BEGIN


                   INSERT INTO 資料表

              SET @counter = @counter + 1


              IF @@ERROR > 0
                   GOTO NeedRollBack

    ......

    END


    NeedRollBack:
    IF @@ERROR > 0
         ROLLBACK TRAN
    ELSE
         COMMIT TRAN


    GO

    ---------------------------------------------------

    不好意思,這程式的某一些宣告有拿掉了。

    總而言之,程式做的是當@counter小於某一個值時,就一直在一個資料表加一筆資料

    想要請教各位的是

    假設迴圈會執行5次 在執行前兩次的時候成功的新增兩筆資料到資料表

    但在第三次的時候,有意外發生導致需要ROLLBACK,

    這時候 資料表會剩下兩筆還是沒有資料?

    也就是說,是只要有問題發生,就ROLLBACK到迴圈未執行前的狀態,

    還是只會ROLLBACK到錯誤發生之前的狀態

    請幫忙回答 謝謝

     

     

     

    2007年3月27日 上午 06:54

解答

  • 如果 Transaction 只有一個 (也就是只下一次 BEGIN TRAN) 的時候,ROLLBACK TRAN 會回溯到 BEGIN TRAN 前的狀態,不管有沒有迴圈 .
    2007年3月27日 下午 01:34
    版主

所有回覆

  • 如果 Transaction 只有一個 (也就是只下一次 BEGIN TRAN) 的時候,ROLLBACK TRAN 會回溯到 BEGIN TRAN 前的狀態,不管有沒有迴圈 .
    2007年3月27日 下午 01:34
    版主
  •  

    BEGIN TRAN

     

    WHILE @counter < @targetNo
      BEGIN


                   INSERT INTO 資料表

              SET @counter = @counter + 1


              IF @@ERROR > 0
                   GOTO NeedRollBack

    ......

    END


    NeedRollBack:
    IF @@ERROR > 0
         ROLLBACK TRAN
    ELSE
         COMMIT TRAN


    GO

    ---------------------------------------------

    我 BEGIN TRAN 是這樣子寫的

    中間只包了一個迴圈坐新增一筆資料到資料表的動作

    所以這樣子的話 就是 只要在迴圈中執行資料表新增時 發生錯誤的話

    就會ROLLBACK的迴圈還未執行之前的狀況嗎

    請幫忙回答 謝謝

    2007年3月28日 上午 09:59
  • 我很想問你一個問題,就是:

     

    你試過了沒有?

    2007年3月28日 下午 01:46
    版主
  • 我不知道該怎麼試ROLLBACK的程式

    因為我不知道怎麼讓他在執行到一半的時候發生錯誤

    如果您可以提出一個方式讓我試的話 我會非常感謝

    2007年3月29日 上午 01:37
  • RAISERROR
    2007年3月29日 上午 03:30
    版主