当插入的时间少于GETDATE()
时,我创建了一个触发器,将数据类型time列的值设置为nullALTER trigger [dbo].[NULL_TIME_TRIGGER]
on [dbo].[Products]
after insert
as
update Products
set ParkingStartTime = NULL
from Products
join inserted i
on i.ParkingStartTime = Products.ParkingStartTime
where i.ParkingStartTime < CAST(GETDATE() AS TIME);
问题是当I select * From table
记录仍然有时间而不是NULL
时。
任何想法?
的问候。
答案 0 :(得分:1)
我认为最后,您需要一个sql作业,只需查看并在时间条件小于getDate()时将时间设置为null
答案 1 :(得分:0)
我真诚地不知道你的触发器有什么问题,应该是AFAIK工作。
但这绝对是不的方式。你似乎试图验证一些插入的值。如果是这种情况,您应该使用INSTEAD OF INSERT
触发器,而不是AFTER INSERT
,就像您目前正在做的那样。
所以它会是这样的:
ALTER trigger [dbo].[NULL_TIME_TRIGGER]
on [dbo].[Products]
instead of insert
as
begin
insert into Products (
field1, field2, ..., fieldn, ParkingStartTime
) select
field1, field2, ..., fieldn,
case when ParkingStartTime < CAST(GETDATE() AS TIME) then NULL else ParkingStartTime end
from
inserted
end
go
这样SQL Server将拦截Products
表中的所有插入,并且只会在触发器内执行插入,从而修复ParkingStartTime
值。因此,触发器不需要执行另一个更新来使它们正确。
希望它有所帮助。
答案 2 :(得分:0)
rsen娜有一个选择,它在许多方面都是优越的。以下是我将如何播放你的AFTER INSERT版本(asssume int as PK):
ALTER trigger [dbo].[NULL_TIME_TRIGGER]
ON [dbo].[Products]
AFTER INSERT
AS
DECLARE @ID int
SELECT @ID = ID FROM INSERTED
UPDATE Products
SET ParkingStartTime = NULL
WHERE ID = @ID
答案 3 :(得分:0)
我有个主意,是的。插入行时,时间值大于当前时间,因此保持不变。当您检查表格的内容时,某些值已经超过了检查时的当前时间。