2014-01-16 63 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将导致触发器触发一次并处理所有受影响的行。

相关问题