2015-05-04 55 views
3

我有這個結構如下表:更新一個在觸發器列在SQL Server中的同一個表只更新特定的列後,2008年

CREATE TABLE [dbo].[Tasks] 
(
    [TasksID] [int] IDENTITY(1,1) NOT NULL, 
    [CommitteeID] [int] NULL, 
    [TransactionDateTime] [datetime2](7) NULL, 
    [inspectionStatus] [nvarchar](50) NULL, 
    [Latitude] [nvarchar](50) NULL, 
    [Longitude] [nvarchar](50) NULL, 
    [acceptanceState] [nvarchar](50) NULL, 
    [comments] [nvarchar](350) NULL, 
    [ScheduledDateTime] [datetime2](7) NULL, 
) 

我想到底是創建一個觸發器,更新[TransactionDateTime]與當前日期時間,僅當列[acceptanceState]更新。

我創建了以下觸發

CREATE TRIGGER [dbo].[TransactionDateUpdate] 
ON [dbo].[Tasks] 
AFTER UPDATE 
AS BEGIN 
    UPDATE dbo.Tasks 
    SET TransactionDateTime = GETDATE() 
    FROM INSERTED i 
    WHERE i.TasksID = Tasks.TasksID 
END 

這個觸發的問題,它更新列[TransactionDateTime]但如果我對任何在表中的列作出改變,我要的是僅在更改/更新列[acceptanceState]時更新[TransactionDateTime]。我能找到任何幫助嗎?如果[acceptanceState]更改/更新,如何添加更新條件[TransactionDateTime]

我搜索了很多類似的問題,但我沒有發現完全相同的問題。

+4

你將不得不刪除表添加到您的查詢,並檢查inserted和deleted值是不一樣的。 –

+0

另外我相信SQL Server有一個函數「IF UPDATE(ColumnName)」,它可以讓你檢查某個列是否被更新。 –

+0

@TabAlleman:這是怎麼做的多行更新,但? –

回答

10

你只需要添加一個IF更新檢查,並在觸發加盟刪除表:

CREATE TRIGGER [dbo].[TransactionDateUpdate] 
ON [dbo].[Tasks] 
AFTER UPDATE 
AS 
BEGIN 
    IF UPDATE(acceptanceState) --add this line 
    UPDATE dbo.Tasks 
    SET TransactionDateTime = GETDATE() 
    FROM INSERTED i 
    JOIN DELETED d on i.TasksID = d.TasksID --add this line 
    WHERE i.TasksID = Tasks.TasksID 
END 
+0

這是解決我的問題的解決方案 – amal50

+0

很高興聽到!如果您可以請幫我一個忙,並將其標記爲已接受的答案,那就太棒了!謝謝! – FutbolFan

+0

我標記了,對不起,我是新來的,我不知道這個標記 – amal50

3

要做到這一點,最好的辦法是比較InsertedDeleted假表。在AFTER UPDATE觸發器中,Deleted僞表包含舊值,而Inserted包含新值。因此,如果Deleted.acceptanceStateInserted.acceptanceState不同,那麼該列已更新。

所以你需要稍微延長你的觸發器是這樣的:

CREATE TRIGGER [dbo].[TransactionDateUpdate] 
ON [dbo].[Tasks] 
AFTER UPDATE 
AS BEGIN 
    UPDATE dbo.Tasks 
    SET TransactionDateTime = GETDATE() 
    FROM Inserted i 
    INNER JOIN Deleted d ON i.TasksID = d.TasksID 
    WHERE i.TasksID = Tasks.TasksID 
    AND i.acceptanceState <> d.acceptanceState 
END 
+0

優先於接受的答案。但是'WHERE'子句不應該包含'null'嗎? 'AND(i.acceptanceState <> d.acceptanceState or d.acceptanceState IS NULL AND i.acceptanceState IS NOT NULL)' – kuujinbo

相關問題