[英]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. 尽管我能够成功创建存储过程,但使用它时出现
"TRANSACTION BEGIN END MISMATCH"
错误。 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. 您的
RETURN
语句在您的COMMIT
语句之前。
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. 建议您研究@Martin Smith的建议,即使用表值参数而不是拆分字符串(SQL Server 2008+),以及@ Damien_The_Unbeliever建议的预期顺序。
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. 另外,在提交之前,查看
TRY/CATCH
并检查是否存在活动事务( @@TRANCOUNT
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.