虽然我能够成功创建存储过程但是在使用它时会出现"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
答案 0 :(得分:3)
您的RETURN
声明在COMMIT
声明之前。
建议你研究一下@Martin Smith使用表值参数而不是拆分字符串(SQL Server 2008+)以及@ Damien_The_Unbeliever对预期排序的建议。
此外,尝试重写过程以使其不需要游标,并且您在事务中尽可能少地工作。
另外,在提交之前,请查看TRY/CATCH
并检查是否存在活动事务(@@TRANCOUNT
)。