2012-04-23 21 views
2

私のシナリオを説明しましょう。 私の "活動"テーブルに "EstimatedDate"列のレコードが10個あるとします。各レコードはユニークで、異なる「EstimatedDate」を持っています。これらの10個のレコードはすべて、同じ「ProjectId」を持つ1つのプロジェクトに属します。 1行の "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; 

あなたは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 

後者がテストされていません。

+1

同じProjectIDの複数のレコードが異なる新しいEstimatedDateに更新されると、どのような動作になりますか?それは価値がある*(私はこれはOPへの質問であると思います)*行動を指定するか? *(新しいEstimatedDate値のMAX()の選択など)* – MatBailie

+0

@Demsは良い点です。トリガは複数の行を処理しますが、影響を受ける単一行の実際の実装のみを考慮しました。更新しました。 –

関連する問題