如何编写触发器处理批量更新,实现每日日志表的行级更新或插入?
问题原因
你写的触发器用变量单独取出INSERTED表中的一行数据,但SQL Server触发器是按事务触发的——不管批量更新多少行,触发器只会执行一次,INSERTED表会包含所有被更新的行。用变量取值只会拿到其中一行,所以批量更新时只有一行被同步。
解决方案:改成基于集合的操作
把触发器改成用MERGE语句(SQL Server 2008及以上支持),它能在单个语句里完成「匹配则更新,不匹配则插入」的逻辑,并且天然支持处理多行数据:
CREATE TRIGGER [dbo].[Update_Entry_Value_Daily_Log] ON [dbo].[Latest_Entry_Value] AFTER UPDATE AS BEGIN SET NOCOUNT ON; -- 用MERGE同时处理插入和更新 MERGE INTO [dbo].[Entry_Value_Daily_Log] AS target USING ( SELECT Entry_Name, Entry_Group, Value, CAST(GETDATE() AS DATE) AS CurrentDate FROM INSERTED ) AS source ON (target.Entry_Name = source.Entry_Name AND target.Date = source.CurrentDate) WHEN MATCHED THEN -- 当日已有记录,更新Value UPDATE SET target.Value = source.Value WHEN NOT MATCHED THEN -- 当日无记录,插入新行 INSERT (Entry_Name, Entry_Group, Date, Value) VALUES (source.Entry_Name, source.Entry_Group, source.CurrentDate, source.Value); END
关键说明
MERGE的USING子句直接取INSERTED表的所有行,确保批量更新时每一行都被处理- 匹配条件是
Entry_Name和当日日期,保证每个条目每天只有一条最新记录 - 全程基于集合操作,避免了单行变量的局限性,效率也比循环处理更高
内容的提问来源于stack exchange,提问作者Capslock
相关产品推荐
相关产品推荐

