首页 > 解决方案 > 在 SQL Server 中触发?

问题描述

我有引用学生表的类表。当插入> = 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

标签: sql-servertsqltriggers

解决方案


这里要纠正几点:

  1. 我不认为你希望你的触发器放在dbo_student桌子上,因为当你第一次插入一个学生时,他们不会有任何分数。我想你想要添加新dbo_score记录的触发器?

  2. 如评论中所述,如果您为要更新的表设置别名,则应使用符号,update <alias>例如update x

  3. 您不用表名/别名作为要更新的列的前缀,SQL Server 知道您正在更新哪个表。

  4. 您可能希望将更新限制为受使用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,您会想要降低它。由于这些原因,重新计算绝对结果比进行增量更改更简单。


推荐阅读