2011-08-08 64 views
1

這段代碼有什麼問題。COMMIT TRANSACTION請求沒有相應的BEGIN TRANSACTION

當過程中出現一些異常時,會發出此錯誤The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.。我該如何解決它?

BEGIN 
    BEGIN TRANSACTION 
    DECLARE 
     @Id bigint 
     ,@Month nvarchar(100) 
     ,@Year nvarchar(100) 
     ,@CountryofExport nvarchar(100) 
     ,@CountryofOrigin nvarchar(100) 
     ,@HSCode nvarchar(100) 
     ,@Unit nvarchar(100) 
     ,@Quantity nvarchar(100) 
     ,@CustomValue nvarchar(255) 
     ,@Type nvarchar(100) 
     ,@TypeBit bit 
     ,@CountryofExportID int 
     ,@CountryofOriginID int 
     ,@MeasurementId int 
     ,@Remarks nvarchar(500) 
     ,@CommodityId int 
     ,@SDate nvarchar(100) 
     ,@SameRec int 
     ,@counts int 


    DECLARE @Cursor_TradeFlow CURSOR 
    SET @Cursor_TradeFlow = CURSOR FOR 

    SELECT [Id],[Months],[Years],[CountryofExport],[CountryofOrigin],[HSCode],[Quantity],[Unit],[CustomValue],[Type] FROM [Temp_Trading]  

    OPEN @Cursor_TradeFlow 
    FETCH NEXT FROM @Cursor_TradeFlow INTO @Id, @Month, @Year, @CountryofExport, @CountryofOrigin, @HSCode,@Quantity, @Unit, @CustomValue, @Type 

    WHILE @@FETCH_STATUS = 0 

    BEGIN 
    Set @Remarks=''; 




    Declare @EICountry varchar(100), 
    @Checkbit bit, 
    @CheckYearIsNumeric bit, 
    @CheckMonthIsNumeric bit 


     BEGIN TRY   

     SET @CheckMonthIsNumeric= convert(INT, @Month); 

     END TRY 

     BEGIN CATCH 
    begin 

      set @Checkbit=1; 
     set @Remarks = @Remarks + 'Invalid Month' 
     set @CheckMonthIsNumeric=1 
     end 
     END CATCH 



     BEGIN TRY 

      set @CheckYearIsNumeric= convert(INT, @Year); 

     END TRY 
     BEGIN CATCH 


     SET @CheckYearIsNumeric= 1; 
     set @Checkbit=1; 
     set @Remarks = @Remarks + 'Invalid Year' 

     END CATCH  


    Set @SameRec = (Select COUNT(*) From TradeFlow Where int_Month = @CheckMonthIsNumeric and int_Year = @CheckYearIsNumeric 
        and int_OriginLocationId = @CountryofExportID and int_DestinationLocationId = @CountryofOriginID and int_CommodityId = @CommodityId 
        and int_MeasurementId = @MeasurementId) 


    IF @@ERROR <> 0 
    BEGIN 
     ROLLBACK 
    END 

    FETCH NEXT FROM @Cursor_TradeFlow INTO @Id, @Month, @Year, @CountryofExport, @CountryofOrigin, @HSCode,@Quantity, @Unit, @CustomValue, @Type 

    END 
    CLOSE @Cursor_TradeFlow 
    DEALLOCATE @Cursor_TradeFlow 
    COMMIT 
END 
+2

請出示所有相關的代碼。你的代碼不包含'COMMIT TRANSACTION' –

+0

你已經在幾個地方使用了Try/Catch,有什麼理由不使用它而不是@@ Error?例如,圍繞整個循環進行的全局try/catch(而不是當前的@@錯誤檢查)對於您的問題將是一個簡單的解決方案 - 任何意外問題都會使整個事情回滾。 – Tao

+0

爲什麼你使用遊標? – HLGEM

回答

7

有:

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK 
END 

遊標循環中是一個不好的徵兆 - 你回滾事務,然後繼續進入下一個迭代。當循環最終完成時,您嘗試提交併且 - 糟糕 - 不再有任何打開的事務,並且回滾之後的每個操作都已保留。

您可能想要在回滾後使用GOTO退出循環,或者以不同的方式處理錯誤。說出最好的策略可能太難了。

0

你可以使用命名事務:

- 在一開始大交易
BEGIN TRANSACTION BIG_TRANSACTION

-- your code here 

-- a transaction for each fetched item 
BEGIN TRANSACTION FETCH_TRANSACTION 
-- your code here 
if OK 
    COMMIT TRANSACTION FETCH_TRANSACTION 
else 
    ROLLBACK TRANSACTION FETCH_TRANSACTION 

COMMIT/ROLLBACK TRANSACTION BIG_TRANSACTION

相關問題