首页 > 解决方案 > 试图接受超过 60% 的成绩(注),然后得到某个人所有成绩的平均值

问题描述

此代码`使用 Personne

insert into [dbo].[Note] ( noPersonne,cours,note)
values (25,'Math',65)

insert into personnes(nom,prenom)
values('Mark','anthony')

alter table personnes
alter column prenom varchar(50)

select* from personnes
select*from Note


use personne
alter PROCEDURE ajoutNote ( @noPersonne int,
@cours varchar(30),
@note int
)
AS

BEGIN TRAN
    IF @note>=60
    BEGIN 
        INSERT INTO note (noPersonne, cours, note)
        VALUES      (@noPersonne, @cours, @note) 
        BEGIN
            PRINT ('la note a ete rentrer avec succes')
                BEGIN
                    DECLARE @moyenne INT;

                    SET @moyenne = (SELECT AVG(note.note) AS moyenne 
                                    FROM note
                                    WHERE nopersonne=@nopersonne)

                    BEGIN
                        PRINT @moyenne
                        --set @idPersonne=(select nopersonne from Note)
                        --set @Courso=(select cours from Note)

                        --select avg(Note.note) from Note 
                        --where noPersonne=@idpersonne and  cours=@Courso
                    END
                END
        END
        SAVE TRAN f4
        RETURN;
    END
    ELSE
    BEGIN 
        ROLLBACK TRAN
    END



GO

exec ajoutNote 25,'Math',75


select *from personnes
select*from Note'

给我这个:(受影响的 1 行)la note a ete rentrer avec succes 63 Msg 266, Level 16, State 2, Procedure ajoutNote, Line 0 [Batch Start Line 55] EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配. 先前计数 = 6,当前计数 = 7。

完成时间:2020-02-20T14:40:26.6563562-05:00

我只是想摆脱代码做我想要的错误。

标签: sqlcountmismatch

解决方案


您的陈述太多BEGIN...END,而且它们似乎也重叠。您还启动了一个事务,但从不提交它(SAVE TRAN只创建一个保存点,它实际上并没有提交事务)。您没有任何错误检查逻辑,因此我认为不需要显式ROLLBACK TRAN命令。如果事务失败,它将被回滚。

所以清理代码并删除不需要的BEGIN...END块,我想出了这个:

USE personne
GO

ALTER PROCEDURE ajoutNote 
( 
    @noPersonne int
    ,@cours varchar(30)
    ,@note int
)
AS
IF @note>=60
BEGIN
    BEGIN TRANSACTION f4

        INSERT INTO note 
        (
            noPersonne
            ,cours
            ,note
        )
        VALUES
        (
            @noPersonne
            ,@cours
            ,@note
        ) 

        PRINT ('la note a ete rentrer avec succes')

        DECLARE @moyenne INT;

        SELECT @moyenne = AVG(note.note) 
        FROM note
        WHERE nopersonne = @nopersonne

        PRINT @moyenne

    COMMIT TRANSACTION f4

END

请注意,我将支票移到IF @note>=60交易之外。如果@note小于60,我们甚至不需要尝试交易。

编辑:再次查看您的代码后,您可以COMMIT TRAN在 proc 的末尾添加以删除错误,而无需修改 proc 的其余逻辑,特别是SAVE TRAN f4. 我不知道你的要求,所以我不知道这种技术是否适合你的过程。但是,如果您只是添加COMMIT,您的 proc 将如下所示:

ALTER PROCEDURE ajoutNote 
( 
    @noPersonne int
    ,@cours varchar(30)
    ,@note int
)
AS
BEGIN TRAN
    IF @note>=60
    BEGIN 
        INSERT INTO note (noPersonne, cours, note)
        VALUES      (@noPersonne, @cours, @note) 
        BEGIN
            PRINT ('la note a ete rentrer avec succes')
                BEGIN
                    DECLARE @moyenne INT;

                    SET @moyenne = (SELECT AVG(note.note) AS moyenne 
                                    FROM note
                                    WHERE nopersonne=@nopersonne)

                    BEGIN
                        PRINT @moyenne
                        --set @idPersonne=(select nopersonne from Note)
                        --set @Courso=(select cours from Note)

                        --select avg(Note.note) from Note 
                        --where noPersonne=@idpersonne and  cours=@Courso
                    END
                END
        END
        SAVE TRAN f4
        RETURN;
    END
    ELSE
    BEGIN 
        ROLLBACK TRAN
    END

COMMIT TRAN

推荐阅读