如何编写SQL更新触发器,触发时不使用INSERTED值仅同步指定分组数据
触发器修改方案
修正后SQL代码
CREATE TRIGGER [dbo].[TG_DATA_U] ON [dbo].[TABLE2] FOR UPDATE AS BEGIN SET NOCOUNT ON; UPDATE t1 SET PRICE = t2_group1.PRICE FROM TABLE1 t1 -- 筛选本次更新操作涉及的ID,缩小处理范围 INNER JOIN (SELECT DISTINCT ID FROM INSERTED) updated_ids ON t1.ID = updated_ids.ID -- 仅取对应ID下IDGROUP=1的价格作为更新值 INNER JOIN TABLE2 t2_group1 ON t2_group1.ID = t1.ID AND t2_group1.IDGROUP = 1 END
实现说明
- 修复了原触发器的批量更新兼容问题:原写法中如果单次更新TABLE2多条记录,子查询返回多个值会触发SQL报错,改用JOIN关联的写法可支持批量更新场景
- 严格遵循IDGROUP=1的取值规则:更新TABLE1时不再直接使用INSERTED表中的价格,而是主动查询TABLE2中对应ID下IDGROUP为1的有效价格,即使本次更新的是其他IDGROUP的记录,也不会影响TABLE1的取值逻辑
- 性能优化:通过
SELECT DISTINCT ID FROM INSERTED仅处理本次更新涉及的ID,避免全表扫描影响执行效率
如果对应ID不存在IDGROUP=1的记录,上述代码不会更新TABLE1中该ID的价格,若需要兼容该场景,可将INNER JOIN TABLE2 t2_group1改为LEFT JOIN,并配合ISNULL设置默认值即可。
内容的提问来源于stack exchange,提问作者Alan Oliveira
相关产品推荐
相关产品推荐

