简体   繁体   中英

SQL TRANSACTION Begin End mismatch?

Although I am able to create stored procedure successfully I am getting "TRANSACTION BEGIN END MISMATCH" error upon using it. The stored Procedure works fine when I remove transaction.

ALTER PROCEDURE Proc_LoanRepayment @LASAcctno     [VARCHAR] (15),
                                   @EntryDate     [VARCHAR] (8),
                                   @ValueDate     [VARCHAR] (8),
                                   @ModeofPayment VARCHAR(20),
                                   @ChqNo         VARCHAR(20),
                                   @ChqDate       VARCHAR(8),
                                   @ChqAmt        MONEY,
                                   @CstBnkNo      VARCHAR(20),
                                   @Cstbnkid      VARCHAR(20),
                                   @CmpBnkNo      VARCHAR(20),
                                   @Cmpbnkid      VARCHAR(20),
                                   @Narration1    [VARCHAR] (100),
                                   @Narration2    [VARCHAR] (100),
                                   @EntryType     VARCHAR(30),
                                   @PostingString [VARCHAR] (max)
AS
    BEGIN TRAN

    DECLARE @string AS VARCHAR(max)
    DECLARE Cur_A CURSOR FOR
      SELECT *
      FROM   dbo.split(@PostingString, ',')

    OPEN Cur_a

    FETCH NEXT FROM cur_a INTO @string

    WHILE @@FETCH_STATUS = 0
      BEGIN
          IF ( object_id('TempDB..#Temp') ) IS NOT NULL
            BEGIN
                DROP TABLE #Temp
            END

          --    declare @temp table (srno int identity,items varchar(max))              


          SELECT *
          INTO   #temp
          FROM   dbo.Split(@string, '|')

          DECLARE @LoanNo     AS VARCHAR(20),
                  @BankAcct   AS VARCHAR(20),
                  @TDS        AS MONEY,
                  @LASPAC     AS MONEY,
                  @INTRND     AS MONEY,
                  @INTRAC     AS MONEY,
                  @STAXPLRVL  AS MONEY,
                  @PNLINT     AS MONEY,
                  @OVRDUEINT  AS MONEY,
                  @STMPDTYRVL AS MONEY,
                  @PROFESRVL  AS MONEY,
                  @DOCCHGRVL  AS MONEY,
                  @CHQBNCRVL  AS MONEY

          ALTER TABLE #temp
            ADD srno INT IDENTITY

          SELECT @LoanNo = items
          FROM   #temp
          WHERE  srno = 1

          SELECT @bankAcct = items
          FROM   #temp
          WHERE  srno = 2

          SELECT @TDS = items
          FROM   #temp
          WHERE  srno = 3

          SELECT @LASPAC = items
          FROM   #temp
          WHERE  srno = 4

          SELECT @INTRND = items
          FROM   #temp
          WHERE  srno = 5

          SELECT @INTRAC = items
          FROM   #temp
          WHERE  srno = 6

          SELECT @STAXPLRVL = items
          FROM   #temp
          WHERE  srno = 7

          SELECT @PNLINT = items
          FROM   #temp
          WHERE  srno = 8

          SELECT @OVRDUEINT = items
          FROM   #temp
          WHERE  srno = 9

          SELECT @STMPDTYRVL = items
          FROM   #temp
          WHERE  srno = 10

          SELECT @PROFESRVL = items
          FROM   #temp
          WHERE  srno = 11

          SELECT @DOCCHGRVL = items
          FROM   #temp
          WHERE  srno = 12

          SELECT @CHQBNCRVL = items
          FROM   #temp
          WHERE  srno = 13

          INSERT INTO Tbl_BankEntry
                      (LASAcctno,
                       EntryDate,
                       ValueDate,
                       ModeofPayment,
                       ChqNo,
                       ChqDate,
                       ChqAmt,
                       CstBnkNo,
                       Cstbnkid,
                       CmpBnkNo,
                       Cmpbnkid,
                       Narration1,
                       Narration2,
                       LoanNo,
                       BankAcct,
                       TDS,
                       LASPAC,
                       INTRND,
                       INTRAC,
                       STAXPLRVL,
                       PNLINT,
                       OVRDUEINT,
                       STMPDTYRVL,
                       PROFESRVL,
                       DOCCHGRVL,
                       CHQBNCRVL,
                       status,
                       mkrdt,
                       mkrid,
                       EntryType)
          VALUES     ( @LASAcctno,
                       @EntryDate,
                       @ValueDate,
                       @ModeofPayment,
                       @ChqNo,
                       @ChqDate,
                       @ChqAmt,
                       @CstBnkNo,
                       @Cstbnkid,
                       @CmpBnkNo,
                       @Cmpbnkid,
                       @Narration1,
                       @Narration2,
                       @LoanNo,
                       @BankAcct,
                       @TDS,
                       @LASPAC,
                       @INTRND,
                       @INTRAC,
                       @STAXPLRVL,
                       @PNLINT,
                       @OVRDUEINT,
                       @STMPDTYRVL,
                       @PROFESRVL,
                       @DOCCHGRVL,
                       @CHQBNCRVL,
                       'P',
                       GETDATE(),
                       'c97176',
                       @EntryType   )

          FETCH NEXT FROM Cur_a INTO @string
      END 

    CLOSE cur_a  

    DEALLOCATE cur_a  

    RETURN  

    COMMIT TRAN   

Your RETURN statement is before your COMMIT statement.

Suggest you look into @Martin Smith's sugegstion of using table valued parameters rather than splitting strings (SQL Server 2008+), and @ Damien_The_Unbeliever's suggestion of the expected ordering.

Also, try to rewrite procedure so that it doesn't require a cursor, and that you do the least amount possible of work inside the transaction.

Also, look at TRY/CATCH and checking whether there is an active transaction ( @@TRANCOUNT ) before commiting.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM