You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效重构含重复代码的SQL Server触发器?

优化后的触发器代码
create trigger dbo.trg_active_problem
on dbo.active_problem
after update
not for replication
as 
begin
    if @@ROWCOUNT = 0 return

    set nocount on;

    -- 提前计算模式名和表名,避免重复调用系统函数
    declare @schemaName nvarchar(128) = OBJECT_SCHEMA_NAME(@@PROCID, DB_ID());
    declare @tableName nvarchar(128) = OBJECT_NAME(OBJECT_ID('active_problem'), DB_ID());

    insert into dbo.dmlactionlog(
        schemaname, 
        tablename, 
        affectedcolumn,
        oldvalue,
        newvalue
    ) 
    -- diagnosis字段的日志逻辑
    select  
        @schemaName,
        @tableName,
        'diagnosis',
        d.diagnosis,
        i.diagnosis
    from inserted i
    join deleted d on i.active_problem_id = d.active_problem_id
    where UPDATE(diagnosis) 
      and coalesce(i.diagnosis, '') != coalesce(d.diagnosis, '')
    
    union all

    -- type字段的日志逻辑
    select  
        @schemaName,
        @tableName,
        'type',
        d.[type],
        i.[type]
    from inserted i
    join deleted d on i.active_problem_id = d.active_problem_id
    where UPDATE(type) 
      and coalesce(i.type, '') != coalesce(d.type, '')
end;
go

优化说明

  • 消除重复代码:用UNION ALL合并两段高度相似的插入逻辑,只保留一次INSERT框架。后续新增需要监控的字段时,只需追加一段UNION ALL的SELECT即可,大幅降低维护成本。
  • 提升执行效率:提前计算并存储@schemaName和@tableName变量,避免重复调用OBJECT_SCHEMA_NAME和OBJECT_NAME系统函数,减少不必要的计算开销。
  • 保留逻辑完整性:依旧保留UPDATE()函数判断字段是否被更新,以及coalesce值对比判断内容是否实际变化的逻辑,确保日志只记录有效更新操作。
  • 增强可读性:每个字段的日志逻辑独立成一段SELECT,结构清晰,便于理解和修改。

内容的提问来源于stack exchange,提问作者Prajwol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:35:18