首页 > 解决方案 > 删除触发器中的多个 IF 语句

问题描述

我正在尝试在 SQL Server 触发器中创建以下逻辑:

  1. 检查 Deleted.ProfID = 3
  2. 如果是,检查 tblPartLic 中是否没有 ProfID = 3 的记录,然后
  3. 如果不是,则在 tblParticipantLicense 中插入一条未获得许可的 3 记录
    —— idsNumber, txtEmailAddress, state = 70 state

我试过了:

IF (deleted.idsProf = 3)
BEGIN

    IF NOT Exists(Select PL.idsNumber FROM tblPartLic PL INNER JOIN Deleted D 
        ON PL.idsNumber=D.idsNumber 
        WHERE PL.idsProfession = 3 AND PL.idsState <> 70)
    BEGIN

        INSERT INTO tblPartLic (idsNumber, txtLicNumber, txtState, txtProfOrg, 
                idsCountry, idsState, idsProf)
            SELECT Deleted.idsDASNumber, 'AR NL', 'NL', 'Architect', 208, 70, 3
            FROM Deleted 

    END;
END;            

标签: sqlsql-serverdatabase-triggernested-if

解决方案


Deleted是一个表(伪表),因此可能有多行 - 其中一些可能有ProfID = 3,其中一些可能有ProfId <> 3. 这是必须处理的。关系数据库也是为基于集合的操作而设计的,而不是为过程操作而设计的。where您的逻辑可以使用适当的子句构建到单个插入语句中。以下重现了您在上面显示的内容:

INSERT INTO tblPartLic (idsNumber, txtLicNumber, txtState, txtProfOrg, idsCountry, idsState, idsProf)
    SELECT D.idsDASNumber, 'AR NL', 'NL', 'Architect', 208, 70, 3
    FROM Deleted D
    -- Condition 1 - ProfID = 3
    WHERE D.ProfID = 3
    -- Condition 2 - No existing record in tblPartLic
    AND NOT EXISTS (
        SELECT PL.idsNumber
        FROM tblPartLic PL
        WHERE PL.idsProfession = 3 AND PL.idsState <> 70
        AND PL.idsNumber = D.idsNumber
    );

推荐阅读