作者:mobiledu2502909131 | 来源:互联网 | 2023-08-11 09:31
我有参考学生表的班级表。
当插入> = 8的英语主题分数时,我为+1的exellent_eng编写了一个触发器,但是有错误:
消息4104,级别16,状态1,过程tr_addExellentEnglishStudent,第3行[批处理开始第1行]
不能绑定多部分标识符“ x.exellent_Eng”。
我正在使用SSMS。
CREATE TRIGGER tr_addExellentEnglishStudent ON dbo.dbo_student AFTER INSERT AS
BEGIN
UPDATE dbo.dbo_class
SET x.exellent_Eng += 1
FROM dbo.dbo_class x
JOIN dbo.dbo_student s ON s.class_id = x.class_id
JOIN dbo.dbo_score c ON c.student_id = s.student_id
WHERE (c.subject_id = 1 AND c.score_id >= 8)
END
这里要纠正的几点:
-
我认为您不希望在dbo_student
表上使用触发器,因为当您第一次插入学生时,他们不会有任何分数。我认为您想触发添加新的dbo_score
记录的事情吗?
-
如注释中所述,如果为要更新的表添加别名,则应使用符号update
,例如update x
-
您无需在要更新的表列前添加表名/别名,SQL Server知道要更新的表。
-
您可能希望将更新限制为使用Inserted
伪表影响的学生。
CREATE TRIGGER tr_addExellentEnglishStudent ON dbo.dbo_score
AFTER INSERT AS
BEGIN
UPDATE x SET
exellent_Eng += 1
FROM dbo.dbo_class x
JOIN dbo.dbo_student s ON s.class_id = x.class_id
JOIN dbo.dbo_score c ON c.student_id = s.student_id
WHERE (c.subject_id = 1 AND c.score_id >= 8)
and c.id in (select id from Inserted)
END
注意:这不考虑任何可能出现的极端情况,例如如果您将现有分数从7更新为8,那么从技术上讲,您希望增加excellent_Eng
的结果。同样,如果您删除分数或将分数从8更新到7,则需要降低分数。由于这些原因,重新计算绝对结果比进行增量更改更简单。