试着接受一个超过60%的分数,然后得到某个人所有分数的平均值



此代码`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一个完全的租房者成功了63Msg 266,级别16,状态2,过程ajoutNote,第0行[批处理开始第55行]EXECUTE之后的事务计数表示BEGIN和COMMIT语句的数量不匹配。先前计数=6,当前计数=7。

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

我只是想摆脱这个错误,代码做我想做的事。

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来删除错误,而无需修改进程的其余逻辑,特别是SAVE TRAN f4。我不知道你的要求,所以我不知道这种技术是否适合你的proc。但如果你只添加COMMIT,你的过程会像这样:

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

相关内容

  • 没有找到相关文章

最新更新