含JOIN的SQL UPDATE语句CASE WHEN语法错误及修正咨询
修正SQL条件更新语句的语法错误并实现需求
错误原因分析
你的修改后语句出现语法错误,根源在两处:
CASE语句未用END关键字闭合,SQL要求必须遵循CASE ... WHEN ... THEN ... ELSE ... END的完整结构ELSE分支里的DATEADD函数括号不完整,GETDATE()后面遗漏了一个闭合括号
修正后的完整代码
UPDATE [SomeSchema].[Synchronization] SET [NextSynchronizationMoment] = CASE WHEN DATEDIFF(s, GETDATE(), s.[NextSynchronizationMoment]) < t.Interval THEN DATEADD(s, t.Interval, s.[NextSynchronizationMoment]) -- 常规同步:以上次同步时间加间隔计算下次时间 ELSE DATEADD(s, t.Interval, GETDATE()) -- 补漏同步:以当前时间加间隔,跳过已错过的同步节点 END FROM [SomeSchema].[Synchronization] s INNER JOIN #syncs ON #syncs.SynchronizationApiSubscriptionId = s.SynchronizationApiSubscriptionId INNER JOIN [SomeSchema].[SynchronizationTier] t ON s.SynchronizationTierId = t.SynchronizationTierId
逻辑优化补充
原条件 DATEDIFF(s, GETDATE(), s.[NextSynchronizationMoment]) < t.Interval 的逻辑等价于原计算的下次同步时间(上次时间+间隔)晚于当前时间,如果想让条件更直观,可改写为:
WHEN DATEADD(s, t.Interval, s.[NextSynchronizationMoment]) > GETDATE()
两种写法效果完全一致,可根据可读性选择。
内容的提问来源于stack exchange,提问作者Zenith
相关产品推荐
相关产品推荐

