首页 > 解决方案 > 将新成绩添加到数据库时,Microsoft sql 会触发自动更新 GPA

问题描述

有2张桌子:

学生(学生,LName,FName,GPA)

Enroll(enrollid, CourseID, Semester, Grade)

我想创建一个触发器,每次添加新成绩时更新 GPA,计算是 gpa = (old.gpa + new.grade)/count(grade) where studentid = new.studentid

这是我的代码,但它不起作用

Create trigger [dbo].[stud_marks] 
on 
[dbo].[enroll] 

after INSERT,update 


AS 
DECLARE @id as int
DECLARE @newgrade as int
SELECT @id = studentid, @newgrade = grade
FROM inserted

begin
UPDATE students
set gpa = (gpa + @newgrade)/count(@id)
end

它显示一个错误:

Msg 157, Level 15, State 1, Procedure stud_marks, Line 16 [Batch Start Line 7]
An aggregate may not appear in the set list of an UPDATE statement.

标签: sqlsql-servertriggers

解决方案


正如其他人所说,这不是一个好主意,不是 3NF,并且会导致数据不一致。这些都是坏事,不要这样做。

话虽如此,问题不在于您的触发器,而在于您的 UPDATE。

您没有将更新限制为特定学生,而是尝试在更新中执行聚合,这是一个禁忌。这就是你的更新应该看起来的样子,我以一种老屁的方式实现了它,没有使用 WITH,但是 a)我是个老屁,而且 b)你让我远离了看我的“Matlock” “马拉松来写这个。无论如何,这是您应该编写的更新。

UPDATE students
set gpa = (select avg(grade) + @newgrade from enroll where studentid=@id)
    /(select count(*)+1 from enroll where studentid=@id )
where studentid=@id 

好吧,现在我得回去做些老放屁的事情了。如果你们中的任何一个鞭打者给我一个“好的,布默”,请记住——我可以操作手动变速器。


推荐阅读