sql - 删除触发器中的多个 IF 语句
问题描述
我正在尝试在 SQL Server 触发器中创建以下逻辑:
- 检查 Deleted.ProfID = 3
- 如果是,检查 tblPartLic 中是否没有 ProfID = 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;
解决方案
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
);
推荐阅读
- mysql - 查询以从 Spring Data mongo 返回单个字段
- swift - 联系位掩码
- sql - MSSQL:多次引用其他表
- tfs - TFS 迁移到具有新名称的新服务器
- c# - 在 C# Visual Studio 中调用 IronPython 时 C# WPF UI 冻结
- php - wordpress 从其他站点获取用户数
- java - 如何在 OS X 上连接 Eclipse 和 JPL
- netsuite - 单击 Suitelet 中的按钮后如何从函数返回值
- mysql - 我想向客户销售固定数量的产品。如何在春季 jpa 中管理并发?
- microcontroller - vTaskStartScheduler() 后无法读取中断优先级