2011-08-08 389 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

をBEGIN関連するすべてのコードを表示してください。あなたのコードに 'COMMIT TRANSACTION'が含まれていません –

+0

あなたは既にTry/Catchをいくつかの場所で使用していますが、@@ Errorの代わりに使用していない理由はありますか?たとえば、現在の@@エラーチェックではなく、ループ全体のグローバルなtry/catchは、問題の単純な解決策になります。 – Tao

+0

なぜカーソルをまったく使用していますか? – HLGEM

答えて

7

:カーソルループ内

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK 
END 

は悪い兆候である - あなたは、トランザクションをロールバックして、次の反復に続けます。ループが最後に終了すると、あなたはコミットしようとします。 - Oops - 開いているトランザクションはなくなり、ロールバック後のすべての操作はそのまま残ります。

ロールバック後にループを終了させるには、GOTOを使用するか、別の方法でエラーを処理します。最高の戦略が何であるかを知るのは難しいです。

0

あなたが名前の取引使用することができます

- 初めに大きな取引を
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

関連する問題