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

如何编写触发器处理批量更新,实现每日日志表的行级更新或插入?

问题原因

你写的触发器用变量单独取出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:45:35