2014-01-16 64 views
0

我試圖用時間戳更新字段LastUpdate,只要其他兩個字段中的任何一個被更改爲與原始值不同的值。這兩列是LoadDateCompleteDate。觸發器我有工作,但由於我每次運行我的進程時都更新行,無論日期是否更改,它都會更新時間戳。我需要比較以查看舊的LoadDate與新的LoadDate是不同的,還是舊的CompleteDate與新的CompleteDate不同。這是我的觸發器:觸發更新時間戳如果新的字段值!=舊的字段值

CREATE TRIGGER time_stamp 
ON my_table 
FOR UPDATE, INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @LoadDate datetime, @CompleteDate datetime 
    SELECT @LoadDate = LoadDate, @CompleteDate = CompleteDate FROM my_table 

    UPDATE my_table 
    SET LastUpdate = GETDATE() 
    WHERE LoadDate = @LoadDate 
    AND CompleteDate = @CompleteDate 
END 
+0

'inserted'和'deleted'是表,以便它們可以表示設置操作的結果。假設它們總是包含一行,設計一個觸發器通常是一個糟糕的計劃。您可以使用比較_before_和_after_值並更新正確的行。 [This](http://www.mssqltips.com/sqlservertip/2342/understanding-sql-server-inserted-and-deleted-tables-for-dml-triggers/)提供了一個介紹。 – HABO

回答

0

你應該只需要一個語句在你的觸發器。像這樣的東西應該這樣做:

update MT 
    set LastUpdate = GetDate() 
    from My_Table as MT inner join 
    -- Inner join with inserted to pick up only those rows inserted or updated. 
    inserted as i on i.YourIdColumn = MT.YourIdColumn left outer join 
    -- Left outer join with deleted to pick up the "before" values if this is an UPDATE. 
    deleted as d on d.YourIdColumn = MT.YourIdColumn 
    where 
    -- LoadDate has changed or this is an INSERT. 
    (i.LoadDate <> d.LoadDate or d.LoadDate is NULL) or 
    -- CompleteDate has changed or this is an INSERT. 
    (i.CompleteDate <> d.CompleteDate or d.CompleteDate is NULL) 

請注意,這是執行設置操作。影響多行的INSERT或UPDATE將導致觸發器觸發一次並處理所有受影響的行。

相關問題