SQL TRANSACTION开始结束不匹配?

时间:2014-01-13 10:47:13

标签: sql sql-server tsql stored-procedures transactions

虽然我能够成功创建存储过程但是在使用它时会出现"TRANSACTION BEGIN END MISMATCH"错误。删除事务时,存储过程正常工作。

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   

1 个答案:

答案 0 :(得分:3)

您的RETURN声明在COMMIT声明之前。

建议你研究一下@Martin Smith使用表值参数而不是拆分字符串(SQL Server 2008+)以及@ Damien_The_Unbeliever对预期排序的建议。

此外,尝试重写过程以使其不需要游标,并且您在事务中尽可能少地工作。

另外,在提交之前,请查看TRY/CATCH并检查是否存在活动事务(@@TRANCOUNT)。