【发布时间】:2018-04-27 06:55:44
【问题描述】:
即使查看了很多线程,我也未能解决此问题。
我有一列十进制(8,4)和一个包含4个案例的数据表,这些案例是直线并超过上限。没关系。我有一个导入脚本,性能没有问题,最多可以使用 20 次。
我尝试了很多方法来处理这个问题,比如(这段代码是 SELECT 语句的一部分):
CASE WHEN PRT.InputColumn > 999 THEN 999.9999 ELSE PRT.InputColumn END as MyColumn
但显然,服务器在评估 WHEN 语句时会考虑十进制(8,4),并且无论如何都会抛出错误。好的,我认为这可能会解决问题:
CASE WHEN TRY_CONVERT(decimal(12,4), PRT.InputColumn) IS NULL THEN 999.9999 ELSE PRT.InputColumn END as MyColumn
但是,我还是遇到了同样的错误:
Arithmetic overflow error converting numeric to data type numeric.
所以我的意思是保持列数据类型不变并处理过多的值。 处理溢出值的正确方法是什么?
【问题讨论】:
-
应该是
TRY_CONVERT(decimal(8,4))而不是12,4。如果它是decimal(8,4),它最多可以是 9999 而不是 999。更短的语法:COALESCE(TRY_CONVERT(decimal(8,4)), 9999.9999) -
我从十进制(8,4)开始,但不允许过多的数字,所以我尝试扩大它;既然您指出了这一点,我认为这与 NULL 相比没有意义。我在那里有 9999,只是在它不起作用时试图降低安全界限。较短的语法是有意义的;你错过了输入变量,但我明白了:-)。我将重复几次测试,以确保我没有错过正确的语法。感谢您的建议。
-
@dnoteth:哦,真丢脸。在尝试进行测试时,我确实错过了正确的语法组合......你的两个建议都有效。如果您将其复制并粘贴到单独的答案中,我很乐意接受。谢谢。
标签: sql sql-server casting decimal overflow