簡體   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