Arithmetic overflow error converting varchar to data type numeric in SQL Server

Haz*_*Haz 0 sql t-sql sql-server numeric type-conversion

尝试进行此转换时,出现“算术溢出”错误:

select convert(numeric(10, 4), '4236575.320000000000000000')
Run Code Online (Sandbox Code Playgroud)

但是可以使用以下命令将其转换为不带小数的数字:

select convert(numeric, '4236575.320000000000000000')
Run Code Online (Sandbox Code Playgroud)

这是什么原因呢?

Sal*_*n A 5

该值4236575.320000000000000000的数据类型为,NUMERIC(25, 18)因为您在小数点前有7位数字,在小数点后有18位数字。

话虽如此,只要可以存储小数点前的部分而不会截断,则可以使用较小的精度和小数位数:

SELECT str
     , CONVERT(NUMERIC(8, 1), str) AS [ddddddd.d]
     , CONVERT(NUMERIC(7, 0), str) AS [ddddddd]
     , CONVERT(NUMERIC(9, 2), str) AS [ddddddd.dd]
FROM (VALUES
    ('4236575.320000000000000000')
) AS tests(str)
Run Code Online (Sandbox Code Playgroud)

结果:

str                        | ddddddd.d | ddddddd | ddddddd.dd
4236575.320000000000000000 | 4236575.3 | 4236575 | 4236575.32
Run Code Online (Sandbox Code Playgroud)