2015-11-08 16 views
1

我想創建一個觸發器,當下面的列被更新爲5SQL - 後更新觸發器 - 如何添加時間戳當列的值更改爲特定值

dbo.tbl_dispatching.Status_ID = "5" 
更新列

dbo.tbl_dispatching.Actual_Pickup_Time 

時間戳

而更新

dbo.tbl_dispatching.Actual_Delivery_Time 

具有時間戳時,下面列被更新至8

dbo.tbl_dispatching.Status_ID = "8" 

我至今不知道如何去完成它做到了這一點:

CREATE TRIGGER Delay_Timestamp ON [dbo].[tbl_dispatching] 
FOR UPDATE 
AS 
    declare @DispatchingID int; --Primery Key of Dispatching_ID 
    declare @Statusid int; 
    declare @Actual_Pickup_Time datetime; 
    declare @Actual_Delivery_Time datetime; 
    declare @audit_action varchar(100); 

select @DispatchingID=i.dispatching_id from inserted i; --Primery Key of Dispatching_ID 
select @Statusid=i.Status_ID from inserted i; 
select @Actual_Pickup_Time=i.Actual_Pickup_Time from inserted i; 
select @Actual_Delivery_Time=i.Actual_Delivery_Time from inserted i; 

if @StatusID = (5) 
    set @Actual_Pickup_Time=GETDATE(); 
if @StatusID = (8) 
    set @Actual_Delivery_Time=GETDATE(); 

update set tbl_Dispatching(Actual_Pickup_Time,Actual_Delivery_Time) 
values (@Actual_Pickup_Time,@Actual_Delivery_Time) where dispatching_id = @DispatchingID 
go 

將這項工作?

回答

1

你根本缺陷是,你似乎期望觸發被解僱行一次 - 這是在SQL Server的情況。相反,觸發器會根據語句觸發一次,並且僞表InsertedDeleted可能包含多行

在這種情況下,這個任務

select @Statusid=i.Status_ID from inserted i; 

會挑一個,任意行Inserted表和忽略所有其他行 - 通常不是你想要的。

你需要重寫你的觸發器在基於一套時尚 - 不要指望InsertedDeleted只包含一個單排 - 他們不會!

您需要使用的代碼是這樣的:

CREATE TRIGGER Delay_Timestamp ON [dbo].[tbl_dispatching] 
FOR UPDATE 
AS 
    -- Update Actual_Pickup_Time if "Status_ID" has changed to 5 
    UPDATE disp 
    SET Actual_Pickup_Time = SYSDATETIME() 
    FROM dbo.tbl_Dispatching disp 
    INNER JOIN Inserted i ON i.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! 
    INNER JOIN Deleted d ON d.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! 
    WHERE 
      i.Status_ID = 5   -- new value is 5 
      AND d.Status_ID <> 5 -- old value was NOT 5 

    -- Update Actual_Delivery_Time if "Status_ID" has changed to 8 
    UPDATE disp 
    SET Actual_Delivery_Time = SYSDATETIME() 
    FROM dbo.tbl_Dispatching disp 
    INNER JOIN Inserted i ON i.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! 
    INNER JOIN Deleted d ON d.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! 
    WHERE 
      i.Status_ID = 8   -- new value is 8 
      AND d.Status_ID <> 8 -- old value was NOT 8 
+0

謝謝你,這只是工作就像一個魅力 –

相關問題