如何修复SQL更新表拼接年月为日期时子查询返回多值的错误
问题原因
你原来的写法错误核心是子查询没有和外层更新的行做绑定,执行时会返回整张[dbo].[National_Data]表所有行的日期转换结果,数据库无法确定要把多个返回值中的哪一个赋值给当前正在更新的行,因此触发512错误。你的推测是正确的,原有逻辑没有实现逐行计算。
修复方案
不需要额外嵌套子查询,直接在SET语句中引用当前行的year、month字段做转换即可,修正后的SQL如下:
UPDATE [dbo].[National_Data] SET [date] = CONVERT(DATE, CONCAT([year], '-', [month], '-01'))
补充说明
- 如果你的SQL Server版本支持
DATEFROMPARTS函数,更推荐用这个更安全的语法做日期拼接,避免因year、month字段是数值类型时的格式转换异常:
UPDATE [dbo].[National_Data] SET [date] = DATEFROMPARTS([year], [month], 1)
- 执行UPDATE前建议先加WHERE条件测试小范围数据,或者先执行SELECT验证转换结果是否符合预期:
SELECT [year], [month], CONVERT(DATE, CONCAT([year], '-', [month], '-01')) AS 转换后日期 FROM [dbo].[National_Data]
内容的提问来源于stack exchange,提问作者Sarah Ghaya
相关产品推荐
相关产品推荐

