Sql 存储过程错误:执行后的事务计数表示BEGIN和COMMIT语句的数量不匹配
我的存储过程工作正常,当我在tbl_CreateFreeBet表上传递新的输入值时,当我传递已经存在的值时,它会抛出一个错误 EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=0,当前计数=1。1行生效 当我试图将输出值设置为Sql 存储过程错误:执行后的事务计数表示BEGIN和COMMIT语句的数量不匹配,sql,sql-server-2012,Sql,Sql Server 2012,我的存储过程工作正常,当我在tbl_CreateFreeBet表上传递新的输入值时,当我传递已经存在的值时,它会抛出一个错误 EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=0,当前计数=1。1行生效 当我试图将输出值设置为 SET @strResp = 'Free bet already exists' 它返回1行,但在本例中不会执行任何insert语句 PFB我的存储过程: ALTER PROCEDURE sp_CreateNewFreeBet
SET @strResp = 'Free bet already exists'
它返回1行,但在本例中不会执行任何insert语句
PFB我的存储过程:
ALTER PROCEDURE sp_CreateNewFreeBet
(@matchId int,
@tournamentId int,
@freeBetAmount int,
@freeBetMsg varchar(500),
@userEmail nvarchar(256),
@strResp varchar(256) output)
AS
BEGIN
SET XACT_ABORT ON
SET NoCount ON
DECLARE @TransactionNewFreeBet varchar(20) = 'TranNewfreeBet'
DECLARE @FreeBetCount int
BEGIN TRY
BEGIN TRAN @TransactionNewFreeBet
SELECT
@FreeBetCount = COUNT(FreeBetID)
FROM
tbl_CreateFreeBet
WHERE
MatchID = @matchId AND TournamentID = @tournamentId
IF @FreeBetCount < 50
BEGIN
IF NOT EXISTS (SELECT FreeBetID FROM tbl_CreateFreeBet
WHERE FreeBetDescription = @freeBetMsg
AND TournamentID = @tournamentId
AND MatchID = @matchId)
BEGIN
INSERT INTO tbl_CreateFreeBet
VALUES (@freeBetMsg, @freeBetAmount, @tournamentId, @matchId)
DECLARE @FreeBetId int
SELECT @FreeBetId = FreeBetID
FROM tbl_CreateFreeBet
WHERE FreeBetDescription = @freeBetMsg
AND TournamentID = @tournamentId
AND MatchID = @matchId
DECLARE @UserId nvarchar(128)
SELECT @UserId = Id
FROM AspNetUsers
WHERE Email = @userEmail
INSERT INTO tbl_UserFreeBets (FreeBetID, TournamentID, MatchID, UserForYes, UserForNo, UserForNoBets)
VALUES (@FreeBetId, @tournamentId, @matchId, @UserId, null, null)
COMMIT TRAN @TransactionNewFreeBet
SET @strResp = 'success'
SELECT DISTINCT(tbl_CreateFreeBet.FreeBetID),
tbl_CreateFreeBet.FreeBetDescription,
tbl_CreateFreeBet.FreeBetAmount,
tbl_CreateFreeBet.TournamentID,
tbl_CreateFreeBet.MatchID,
tbl_UserFreeBets.UserForYes,
tbl_UserFreeBets.UserForNo,
tbl_UserFreeBets.UserForNoBets
FROM
tbl_CreateFreeBet, tbl_UserFreeBets
WHERE
tbl_CreateFreeBet.MatchID = tbl_UserFreeBets.MatchID
AND tbl_CreateFreeBet.TournamentID = tbl_UserFreeBets.MatchID
AND tbl_CreateFreeBet.FreeBetID = tbl_UserFreeBets.FreebetID
AND tbl_UserFreeBets.FreebetID = @FreeBetId
END
ELSE
BEGIN
SET @strResp = 'Free bet already exist'
ROLLBACK TRAN @TransactionNewFreeBet
END
END
ELSE
BEGIN
SET @strResp = 'MAX 50 user bets can be created for a match'
ROLLBACK TRAN @TransactionNewFreeBet
END
END TRY
BEGIN CATCH
SET @strResp = ERROR_MESSAGE()
ROLLBACK transaction sp_CreateNewFreeBet
END CATCH
END
请告诉我如何解决此问题。旁注:存储过程不应使用sp_uuu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_uu,并使用其他东西作为前缀-或者根本不使用前缀25年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表列表样式被正确的ANSI连接语法所取代,不鼓励使用它