У вас слишком много 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