2016-12-07 45 views
0

ストアドプロシージャを作成しました。エラーが発生したときにすべてをロールバックする必要がありますが、私は見た目は変わっていませんが、ポップアウトするエラーは見つかりませんでした。トランザクション不一致のSQLストアドプロシージャ

[例外:予期しないSQLエラーが130後のトランザクション数EXECUTEラインでプロシージャ 『ST_IV_ItemPrice.SP_Insert』内のエラー番号266.16.2とソース「ネットSqlClientデータプロバイダ」で発生したBEGINの不一致数を示しますおよびCOMMITステートメント。前のカウント= 1、現在のカウント= 0.]

私はここで助けを得ることができたらいいと思う。

CREATE PROCEDURE [dbo].[ST_IV_ItemPrice.SP_Insert] 
    /*parameters*/ 
AS 
BEGIN 
    IF OBJECT_ID(''tempdb..#tempPriceList'') IS NOT NULL 
     /*Then it exists*/ 
     DROP TABLE #tempPriceList 
    CREATE TABLE #tempPriceList(PriceListid int, NewCurrencyUnitPrice  decimal(19, 5)) 

    DECLARE @Error int, 
     @NextListid int, 
     @NewCurrencyUnitPrice decimal(19, 5), 
     @NoRounding int = 0, 
     @UserSpecified int = 4 



    BEGIN TRANSACTION 
    BEGIN TRY 
     /*Insert item to table*/ 

     SET @Id = SCOPE_IDENTITY() 
     SET @Error = @@ERROR 


     IF @Error = 0 AND @AutoGenerate = 1 
     BEGIN 
      INSERT INTO #tempPriceList(PriceListid, NewCurrencyUnitPrice) 
      VALUES(@Id, @Price) 

      WHILE(EXISTS(SELECT * FROM #tempPriceList)) 
      BEGIN 


      SELECT TOP 1 @NextListid = [id], @NewCurrencyUnitPrice =  [NewCurrencyUnitPrice] 
      FROM #tempPriceList 

      /*INSERT SELECT STATEMENT*/ 

      INSERT INTO #tempPriceList ([PriceListid],[NewCurrencyUnitPrice]) 
      Select [ListId] , [NewCurrencyUnitPrice] 


      IF @Error = 0 AND @SetExpiredDate = 1 AND @FromDate IS NOT NULL 
      BEGIN 
      /*Update item that is same as inserted and set to inactive*/ 


      END 

      DELETE FROM #tempPriceList WHERE PriceListid = @NextListid 

     END 
    END 
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION  
    END CATCH 

    IF @@TRANCOUNT>0 
     COMMIT TRANSACTION 

    RETURN @Error 
END 

答えて

1
CREATE PROCEDURE [dbo].[ST_IV_ItemPrice.SP_Insert] 
    /*parameters*/ 
AS 
BEGIN 
    /* don't drop what does not belong to you */ 
    CREATE TABLE #tempPriceList(PriceListid int, NewCurrencyUnitPrice  decimal(19, 5)) 

    BEGIN TRY 
     /* begin/commit within a single code block */ 
     BEGIN TRANSACTION 

     /* some code */ 

     /* we are here if everything is ok */ 
     COMMIT TRANSACTION 
    END 
    END TRY 
    BEGIN CATCH 
     /* check xact_state instead of @@trancount, because @@trancount may be >0 whilst you are unable to commit/rollback anything */ 
     IF XACT_STATE() IN (-1, 1) 
      ROLLBACK TRANSACTION 

     /* do not suppress exceptions! */ 
     RAISERROR(...) 
    END CATCH 

    /* it will be dropped after you leave SP scope, but you may clean all created here by yourself; this is not required */ 
    IF OBJECT_ID('tempdb..#tempPriceList') IS NOT NULL 
     EXEC('DROP TABLE #tempPriceList') 

    RETURN @Error 
END 
+0

BEGINとCOMMIT文の不一致の数を示し、私はあなたが書かれている通り試してみましたが、私はまだ同じエラー 「トランザクション数は、後にEXECUTEます。前のカウント= 1、現在の数= 0] " –

+0

私は私のプログラムでそれを処理したいと思うので、私はraiserrorを計画しておらず、ユーザが理解できないエラーページに入ることをウェブサイトには望まないでしょう。 –

+0

あなたが' CATCH '全て大丈夫? –