2015-05-04 51 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

相关问题