2012-04-23 83 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