试图接受一个超过 60% 的成绩(注),然后得到某个人所有成绩的平均值
trying to accept a grade(note) that is over 60% and then get the average of all the grade for a certain person
此代码`使用 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 成功
63
消息 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
。我不知道你的要求,所以我不知道这种技术是否适合你的过程。但是,如果您只添加 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
此代码`使用 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 成功 63 消息 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
。我不知道你的要求,所以我不知道这种技术是否适合你的过程。但是,如果您只添加 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