如何高效重构含重复代码的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
相关产品推荐
相关产品推荐

