【问题标题】:Want to update mutiple records with update trigger想要使用更新触发器更新多条记录
【发布时间】:2012-04-23 18:17:34
【问题描述】:

让我解释一下我的情况。 假设我的“活动”表中有 10 条记录,其中包含“EstimatedDate”列。每条记录都是唯一的,并且具有不同的“EstimatedDate”。这 10 条记录都属于一个项目,具有相同的“ProjectId”。 如果我更改一行的“EstimatedDate”,它应该会自动更改表中具有相同“ProjectId”的以下行。

【问题讨论】:

    标签: sql sql-server-2008 sql-update


    【解决方案1】:
    CREATE TRIGGER dbo.Activities_Update
    ON dbo.Activities
    AFTER UPDATE
    AS
    BEGIN
      SET NOCOUNT ON;
      UPDATE a
        SET EstimatedDate = i.EstimatedDate
        FROM dbo.Activities AS a
        INNER JOIN inserted AS i
        ON a.ProjectId = i.ProjectId
        WHERE a.EstimatedDate <> i.EstimatedDate;
    END
    GO
    

    虽然您的 UPDATE 语句不太可能是这样的:

    UPDATE Activities SET EstimatedDate = CASE
      WHEN ActivityID = 1 THEN GETDATE()
      WHEN ActivityID = 2 THEN DATEADD(DAY, 1, GETDATE()) END
    WHERE ProjectID = 1;
    

    如果你想使用inserted 中的MAX 日期,你可以说:

    CREATE TRIGGER dbo.Activities_Update
    ON dbo.Activities
    AFTER UPDATE
    AS
    BEGIN
      SET NOCOUNT ON;
    
      ;WITH i AS (SELECT ProjectId, d = MAX(EstimatedDate)
        FROM inserted GROUP BY ProjectId)
      UPDATE a
        SET EstimatedDate = i.d
        FROM dbo.Activities AS a
        INNER JOIN i
        ON a.ProjectId = i.ProjectId
        WHERE a.EstimatedDate <> i.d;
    END
    GO
    

    后者未经测试。

    【讨论】:

    • 如果同一 ProjectID 的多条记录更新为不同的新 EstimatedDates,会出现什么情况? (我猜这是 OP 的问题) 指定行为是否值得? (比如选择新的 EstimatedDate 值的 MAX()?)
    • @Dems 说得好。虽然触发器确实处理了多行,但我只考虑了受影响的单行的实际实现。已更新。
    猜你喜欢
    • 2012-01-08
    • 2021-10-16
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2021-05-04
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多