删除所有记录时出现问题。
CREATE OR ALTER TRIGGER update_StuIns_OnDelete
ON Class
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Instructor_ID TABLE (id BIGINT);
INSERT INTO @Instructor_ID
SELECT prevC.c_InstructorID
FROM deleted prevC
DECLARE @Institute_ID TABLE (id BIGINT);
INSERT INTO @Institute_ID
SELECT prevC.c_InstituteID
FROM deleted prevC
DECLARE @Instrument_ID TABLE (id BIGINT);
INSERT INTO @Instrument_ID
SELECT prevC.c_InstrumentID
FROM deleted prevC
DECLARE @Student_Id TABLE (id BIGINT);
INSERT INTO @Student_Id
SELECT prevC.c_StudentID
FROM deleted prevC
IF ((SELECT Learning_Time FROM Is_Learning
WHERE l_StudentID IN (SELECT id FROM @Student_Id)
AND l_InstrumentID IN (SELECT id FROM @Instrument_ID)) IS NULL)
BEGIN
DELETE Is_Learning
WHERE l_StudentID IN (SELECT id FROM @Student_Id)
AND l_InstrumentID IN (SELECT id FROM @Instrument_ID)
END
IF((SELECT Teaching_Time FROM Teaches
WHERE t_InstructorID IN (SELECT id FROM @Instructor_ID)
AND t_InstrumentID IN (SELECT id FROM @Instrument_ID)) IS NULL)
BEGIN
DELETE Teaches
WHERE t_InstructorID IN (SELECT id FROM @Instructor_ID)
AND t_InstrumentID IN (SELECT id FROM @Instrument_ID)
END
IF(NOT EXISTS(SELECT * FROM Class C
WHERE C.c_InstructorID IN (SELECT id FROM @Instructor_ID)
AND C.c_InstituteID IN (SELECT id FROM @Institute_ID)))
BEGIN
DELETE Is_MemberOf
WHERE m_InstructorID IN (SELECT id FROM @Instructor_ID)
AND m_InstituteID IN (SELECT id FROM @Institute_ID)
END
END;
当我想删除 1 行时,它工作正常,但对于多行,我收到此错误:
消息 512,级别 16,状态 1,过程 update_StuIns_OnDelete,第 13 行
子查询返回超过 1 个值。当子查询跟在 =、!=、<, <= , >、>= 后面或子查询用作表达式时,这是不允许的。
对于这个问题有什么建议吗?
您的逻辑中有三个
if
陈述。 if ((select ... is null)
,另一个if ((select ... is null
,还有一个if (not exists ...)
在前两种情况下,您将
select
语句(返回一组行)的结果与 null
进行比较。但 null 是单个标量。您无法将整列与 null
进行比较。
更改这两个以匹配第三个
not exists
的 if
结构。
这工作正常。
CREATE OR ALTER TRIGGER update_StuIns_OnDelete ON Class
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT Learning_Time FROM Is_Learning INNER JOIN
deleted d ON l_StudentID = d.c_StudentID AND l_InstrumentID = d.c_InstrumentID
WHERE Learning_Time IS NULL))
BEGIN
DELETE Is_Learning
FROM Is_Learning INNER JOIN
deleted d ON l_StudentID = d.c_StudentID AND l_InstrumentID = d.c_InstrumentID
END
IF(EXISTS(SELECT Teaching_Time FROM Teaches INNER JOIN
deleted d ON t_InstructorID = d.c_InstructorID AND t_InstrumentID = d.c_InstrumentID
WHERE Teaching_Time IS NULL))
BEGIN
DELETE Teaches
FROM Teaches INNER JOIN
deleted d ON t_InstructorID = d.c_InstructorID AND t_InstrumentID = d.c_InstrumentID
END
IF(NOT EXISTS(SELECT * FROM Class C INNER JOIN deleted d
ON C.c_InstructorID = d.c_InstructorID AND C.c_InstituteID = d.c_InstituteID))
BEGIN
DELETE Is_MemberOf
FROM Is_MemberOf INNER JOIN
deleted d ON m_InstructorID = d.c_InstructorID AND m_InstituteID = d.c_InstituteID
END
END;