MSSQL批量更新百万行时GETDATE()取值时机及替换为查询启动时间的方法
GETDATE() 批量更新时的时间取值逻辑
这个问题挺常见的,尤其是处理大表批量更新的时候,很容易纠结时间戳的一致性,我给你明确说清楚:
当你用 GETDATE() 更新数百万行数据时,它返回的是查询启动的时间,所有行的日期值会完全一致,不会出现毫秒级差异。
为什么会这样?因为SQL Server对 GETDATE() 这类系统函数的求值规则是:在单个查询的执行周期内,它只会被计算一次——就是查询开始执行的那一瞬间。之后不管更新操作要处理多少行、花多长时间,所有行的日期字段都会复用这个预先计算好的固定时间戳。哪怕你的更新跑了10秒才完成,每一行的日期都是同一个值。
确保用查询启动时间更新的小技巧
虽然 GETDATE() 本身已经满足需求,但如果是在一些逐行处理的场景(比如用游标循环更新),这时候每次调用 GETDATE() 会返回当前行的处理时间,这时候你可以提前把查询启动时间存到变量里,再用变量来更新:
-- 先把查询启动时间存入变量 DECLARE @BatchStartTime DATETIME = GETDATE(); -- 用变量批量更新所有行 UPDATE YourLargeTable SET CurrentDateField = @BatchStartTime WHERE YourFilterCondition;
这样不管处理多少行,所有行的时间戳都会完全统一,就是查询启动的那个时间点。
内容的提问来源于stack exchange,提问作者user1480192
相关产品推荐
相关产品推荐

