Sql 存储过程错误:执行后的事务计数表示BEGIN和COMMIT语句的数量不匹配

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

我的存储过程工作正常,当我在tbl_CreateFreeBet表上传递新的输入值时,当我传递已经存在的值时,它会抛出一个错误

EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=0,当前计数=1。1行生效

当我试图将输出值设置为

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连接语法所取代,不鼓励使用它