2012-04-23 91 views
2

让我解释一下我的场景。 假设我在“Activities”表中有10条记录,并带有“EstimatedDate”列。每个记录都是唯一的,并具有不同的“EstimatedDate”。这10条记录都属于同一个项目,具有相同的“ProjectId”。 如果我更改一行的“EstimatedDate”,它应该自动更改具有相同“ProjectId”的表中的以下行。想用更新触发器更新多条记录

回答

2
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; 

如果你想要使用insertedMAX日期,你可以说:

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 

后者是未经测试。

+1

如果同一个ProjectID的多个记录更新到不同的新EstimatedDates,那么行为会是什么?它会值得吗?(我想这是对OP的一个问题)*指定一个行为? *(如选择新的EstimatedDate值的MAX()?)* – MatBailie 2012-04-23 18:28:57

+0

@Dems这是一个很好的观点。虽然触发器处理多行,但我只考虑了影响单行的实际实现。更新。 – 2012-04-23 18:35:35