2014-01-13 2 views
0

Хотя я могу успешно создать хранимую процедуру, я получаю ошибку "TRANSACTION BEGIN END MISMATCH" при ее использовании. Хранимая процедура отлично работает при удалении транзакции.SQL 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 
+0

@MitchWheat означает, что я не могу использовать транзакцию в случае курсора? – Arbaaz

+1

уверен, что вы можете. Но милые щенки умирают каждый раз, когда вы делаете! :) –

+1

Если вы находитесь в 2008 году, просмотрите параметры таблицы, а не разделите строки. –

ответ

3

Ваше RETURN заявление перед вашим COMMIT заявление.

Предложите вам ознакомиться с предложением @Martin Smith о использовании параметров таблицы, а не о разбиении строк (SQL Server 2008+) и предложении @ Damien_The_Unbeliever о ожидаемом заказе.

Кроме того, попробуйте переписать процедуру так, чтобы она не требовала указателя и что вы выполняете наименьшую возможную работу внутри транзакции.

Также обратите внимание на TRY/CATCH и проверьте, есть ли активная транзакция (@@TRANCOUNT) перед совершением.

+0

Предполагаемое время разметки вашего ответа: 9 минут! – Arbaaz

+0

Пожалуйста, взгляните на комментарий Damien_The_Unbeliever. Я проверяю эту процедуру несколько раз каждый раз. Порядок строк был таким же, когда я изменил таблицу #temp. Но возможно ли, что это может вызвать проблемы? – Arbaaz