繁体   English   中英

SQL事务开始结束不匹配?

[英]SQL TRANSACTION Begin End mismatch?

尽管我能够成功创建存储过程,但使用它时出现"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   

您的RETURN语句在您的COMMIT语句之前。

建议您研究@Martin Smith的建议,即使用表值参数而不是拆分字符串(SQL Server 2008+),以及@ Damien_The_Unbeliever建议的预期顺序。

另外,尝试重写过程,以便它不需要游标,并且您在事务内部所做的工作最少。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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