更新列中的值并根据值

时间:2018-04-12 09:52:42

标签: sql sql-server

我有一张桌子。在此表中,有三列我对创建触发器感兴趣。

我的表格 - tblABC

column name       data type

Id                int (primary key)
Live              bit
CompletionDate    date
CancelDate        date

所以我希望只要更新CompletionDate或CancelDate就会执行触发器。

我希望触发器做两件事之一

1)如果将CompletionDate或CancelDate列的日期更改为等于今天或更低的日期,那么我希望Live列等于0.

2)如果CompletionDate或CancelDate列的日期更改为大于今天的日期或NULL,那么我希望Live列等于1.

以下是我的代码。我不确定它是否正确我也不确定这将如何处理NULLS?

CREATE TRIGGER TR_MYTRIGGER
ON  tblABC
AFTER UPDATE

update d
set d.Live = 0
from tblABC e d 
inner join inserted i on d.Id = i.Id
where i.CompletionDate <= GETDATE() or i.CancelDate <= GETDATE()

update d
set d.Live = 1
from tblABC d 
inner join inserted i on d.Id = i.Id
where i.CompletionDate > GETDATE() and i.CancelDate > GETDATE()

1 个答案:

答案 0 :(得分:3)

正如您在第二点所说,如果两个日期的 设置为大于今天设置为null,那么您需要设置您的实时列为1.将您的第二个更新查询更改为此。

update d
set d.Live = 1
from tblABC d 
inner join inserted i on d.Id = i.Id
where (i.CompletionDate > GETDATE() or i.CancelDate > GETDATE() 
or i.CompletionDate is null or i.CancelDate is null) and d.Live <> 1

但正如评论中所建议的,计算列似乎是更好的选择。

修改为了优化效果,您不应该更新已经1的行。查看更新的查询。对第一次更新查询执行相同操作。