пытаясь принять оценку (примечание), которая превышает 60%, а затем получить среднее значение по всем оценкам для определенного человека - PullRequest
0 голосов
/ 20 февраля 2020

Этот код `use 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 ave c succes 63 Msg 266, Уровень 16, Состояние 2, Процедура 0 [Batch Start Line 55] Количество транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT. Предыдущий счет = 6, текущий счет = 7.

Время завершения: 2020-02-20T14: 40: 26.6563562-05: 00

Я просто хочу избавиться от ошибки, которую делает код что я хочу.

1 Ответ

1 голос
/ 20 февраля 2020

У вас слишком много BEGIN...END утверждений, и они, похоже, также частично совпадают. Вы также запускаете транзакцию, но никогда не фиксируете ее (SAVE TRAN только создает точку сохранения, но фактически не фиксирует транзакцию). У вас нет ошибок проверки логи c, поэтому я не вижу необходимости в явной команде 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 в конце Профи c для устранения ошибки без изменения остальной части логи c Профи c, в частности SAVE TRAN f4. Я не знаю ваших требований, поэтому я не знаю, подходит ли этот метод вашему профессионалу c. Но если вы просто добавите COMMIT, ваш профи c будет выглядеть так:

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
...