为什么SQL Server使用ROUND抛出算术溢出错误?

Fra*_*ran 5 sql t-sql sql-server sql-server-2008-r2

为什么这么简单

SELECT ROUND(0.99535, 2)
Run Code Online (Sandbox Code Playgroud)

在SQL SERVER 2008 R2中返回算术溢出错误?

Luk*_*zda 4

最终的数据类型是DECIMAL(5,5)没有1.0价值的地方。

SELECT ROUND(0.99535, 2) 
-- it would round to 1.0000 but it is to big for DECIMAL(5,5)
<=>
SELECT CAST(1 AS numeric(5,5))
-- Arithmetic overflow error converting int to data type numeric.
Run Code Online (Sandbox Code Playgroud)

检查元数据:

SELECT name, system_type_name
FROM sys.dm_exec_describe_first_result_set  
(N'SELECT ROUND(0.99535, 2) AS result', null, 0) ;  
-- name     system_type_name
-- RESULT   numeric(5,5)
Run Code Online (Sandbox Code Playgroud)

DBFiddle 演示


为了避免这个问题,您可以将精度更改为 6。

SELECT ROUND(CONVERT(NUMERIC(6,5), 0.99535),2)
Run Code Online (Sandbox Code Playgroud)

DBFiddle 演示 2