SQL Server更新decimal字段替换NULL为0报错及无行受影响问题
问题原因
- NULL值判断逻辑错误:SQL标准中NULL代表未知值,所有常规比较运算符(=、!=、>、<等)和NULL做比较时,返回结果都是UNKNOWN,WHERE子句仅会保留条件计算结果为TRUE的行,因此
WHERE [attr14] = NULL永远无法匹配到任何行,这就是第二次执行返回0行受影响的根本原因,正确的NULL值判断要使用IS NULL/IS NOT NULL语法。 - 首次类型转换错误说明:你定义的attr14是decimal(10,5)类型,理论上写入0或0.0都可以自动隐式转换不会报错,如果出现varchar转numeric的报错,优先检查你的SQL语句是否拼写错误(比如误把其他varchar类型字段名写进了SET赋值部分),或者表上是否存在关联attr14的触发器、计算列逻辑引入了字符类型值。
正确执行语句
直接运行以下SQL即可完成NULL值替换:
UPDATE [myds].[dbo].[mytable] SET [attr14] = 0 WHERE [attr14] IS NULL;
如果需要严格匹配类型避免隐式转换风险,可以显式指定类型:
UPDATE [myds].[dbo].[mytable] SET [attr14] = CAST(0 AS DECIMAL(10,5)) WHERE [attr14] IS NULL;
内容的提问来源于stack exchange,提问作者Patrick Schulz
相关产品推荐
相关产品推荐

