UPDATE语句中GETDATE()返回NULL值的问题排查
嘿,我来帮你排查下这个让你头疼的问题!你说执行UPDATE语句用GETDATE()更新dt_saisie字段却得到NULL,而且确认了字段不可为空、默认值是NULL,那我们可以从这几个方向查起:
先确认WHERE子句是否命中了记录
如果你的WHERE id_...条件没有匹配到任何行,那这条UPDATE语句根本就没修改任何数据,dt_saisie自然还是保持原来的NULL值。你可以先单独执行查询:SELECT * FROM [proliv_min].[dbo].[proliv_production] WHERE id_... -- 把你的完整条件放这里看看有没有返回结果,如果没有,那问题就出在WHERE条件上,得调整条件确保能匹配到要更新的行。
检查
dt_saisie字段的数据类型
要确保这个字段是支持日期时间的类型,比如datetime、datetime2或者smalldatetime。如果是varchar或者其他不兼容的类型,GETDATE()的隐式转换可能出问题(虽然大部分情况会报错,但也不排除特殊场景返回NULL)。你可以用这条语句查看字段类型:sp_help 'proliv_min.dbo.proliv_production'在结果里找到
dt_saisie对应的“类型”列,确认是日期时间类的类型。排查是否有触发器干扰
如果表上存在INSTEAD OF UPDATE或者AFTER UPDATE触发器,可能会覆盖你设置的dt_saisie值,把它改成NULL。你可以先检查表有没有触发器:SELECT name FROM sys.triggers WHERE parent_id = OBJECT_ID('proliv_min.dbo.proliv_production')如果有触发器,查看它的定义,看看是不是在触发器逻辑里修改了
dt_saisie字段的值。确认字段的NOT NULL设置是否真的生效
有时候可能以为设置了字段不可为空,但实际没生效。你可以用这条语句验证:SELECT is_nullable FROM sys.columns WHERE object_id = OBJECT_ID('proliv_min.dbo.proliv_production') AND name = 'dt_saisie'返回值为
0表示字段是NOT NULL,1则表示允许NULL。如果是允许NULL的话,当UPDATE没命中行时,字段就会保持NULL。
按上面的步骤逐一排查,应该就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者Kame_Sennin

