删除多于1条记录后触发

问题描述 投票:0回答:2

删除所有记录时出现问题。

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 个值。当子查询跟在 =、!=、<, <= , >、>= 后面或子查询用作表达式时,这是不允许的。

对于这个问题有什么建议吗?

sql sql-server triggers sql-delete
2个回答
2
投票

您的逻辑中有三个

if
陈述。
if ((select ... is null)
,另一个
if ((select ... is null
,还有一个
if (not exists ...)

在前两种情况下,您将

select
语句(返回一组行)的结果与
null
进行比较。但 null 是单个标量。您无法将整列与
null
进行比较。

更改这两个以匹配第三个

not exists
if
结构。


1
投票

这工作正常。

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;
© www.soinside.com 2019 - 2024. All rights reserved.