【发布时间】:2021-11-27 01:21:47
【问题描述】:
我有这个数据库,我创建了一个函数来更新学生的 GPA。
CREATE OR ALTER FUNCTION fGPA
(@Mno varchar(9))
RETURNS DECIMAL(10,4)
BEGIN
DECLARE @gpa decimal(10,4);
SET @gpa = (SELECT
(SUM(CASE e.Grade
WHEN 'A' THEN 4.0
WHEN 'B' THEN 3.0
WHEN 'C' THEN 2.0
WHEN 'D' THEN 1.0
WHEN 'F' THEN 0.0
END * c.Credit) / SUM(c.Credit))
FROM Enroll AS e
INNER JOIN Section AS s ON s.Sid = e.Sid
INNER JOIN Course AS c ON c.Cno = s.Cno
WHERE @Mno = e.Mno);
RETURN @gpa;
END
我现在正在尝试创建一个触发器,以便每当在 Enroll 中更新成绩时,都会调用 fGPA 函数并同时更新 GPA。这是我所拥有的:
CREATE OR ALTER TRIGGER update_enroll
ON Enroll
AFTER UPDATE
AS
IF (UPDATE(Grade))
BEGIN
DECLARE @updateGPA DECIMAL(10,4);
SET @updateGPA = (SELECT dbo.fGPA(e.Mno)
FROM Enroll as e
INNER JOIN inserted i ON i.Mno = e.Mno);
UPDATE Student
SET student.GPA = @updateGPA;
END
我得到的错误是:
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
当我尝试执行此语句时会发生这种情况
UPDATE ENROLL
SET Grade = 'B'
WHERE Sid = '17504';
【问题讨论】:
-
这可能是您在
fGPA函数中的WHERE子句。看起来您可能已经交换了@Mno和e.Mno。 -
如果表中有超过一行,则此查询将返回不止一行:
SELECT dbo.fGPA(Mno) FROM Enroll。您需要加入inserted虚拟表以识别更新的行并编写触发器来处理多行更新。 -
好的,谢谢。 @DanGuzman 你能展示我如何编写触发器来处理多行更新吗?
-
@BeanBop,我在互联网上搜索“SQL 触发器给出错误。子查询返回超过 1 个值”,this answer 是列表中的第一个。这将回答你的问题。
-
好的,谢谢。是的,我也在看这个。我已经更新了触发器以进行类似的更改,但我仍然遇到同样的错误。
标签: sql-server triggers