为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?

Posted

技术标签:

【中文标题】为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?【英文标题】:Why SQL Server throws Arithmetic overflow error converting int to data type numeric?为什么 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误? 【发布时间】:2011-01-04 18:33:11 【问题描述】:

运行此代码时,SQL Server Management Studio 抛出错误:

declare @percentage numeric(3,2)
set @percentage = cast(15 as numeric(3,2))

但是当我将数字声明更改为

declare @percentage numeric(4,2)
set @percentage = cast(15 as numeric(4,2))

一切顺利。

数值数据类型有限制吗?

【问题讨论】:

【参考方案1】:

相当老的问题,但我想我会在此处添加此问题以完成:有一个 SQL Server 数据库设置会影响查询并引发此错误。

SET NUMERIC_ROUNDABORT  ON | OFF 

将此设置为 ON 将导致这个确切的错误是结果不适合结果数据类型。

例如,将此设置为 ON 并运行

SELECT cast(0.0 / 1 AS NUMERIC(4,2))

会抛出这个错误。

更多信息:https://docs.microsoft.com/en-us/sql/t-sql/statements/set-numeric-roundabort-transact-sql

还有另一种设置方式:

【讨论】:

【参考方案2】:

精度和规模经常被误解。在 numeric(3,2) 中,您需要总共 3 位数字,但小数点右侧需要 2 位。如果您想要 15 => 15.00,那么前导 1 会导致溢出(因为如果您想要小数点右侧的 2 位数字,则左侧只有一位数字的空间)。使用 4,2 没有问题,因为所有 4 位数字都适合。

【讨论】:

【参考方案3】:

NUMERIC(3,2) 表示:共3位,小数点后2位。所以小数点前只有一个小数。

试试NUMERIC(5,2) - 小数点前三位,小数点后两位。

【讨论】:

【参考方案4】:

让我们看看,数字 (3,2)。这意味着您有 3 个数据位,其中两个在小数点右侧,仅在小数点左侧留下一个。 15 在小数点的左边有两位。顺便说一句,如果您可能有 100 作为值,我会将其增加到数字 (5, 2)

【讨论】:

【参考方案5】:

数字定义总位数,然后是小数点后的数字。

数字 (3,2) 最多只能容纳 9.99。

【讨论】:

以上是关于为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 在将值转换为字符串/从字符串转换时是不是考虑文化/区域设置?

SQL:在将 varchar 值 '' 转换成数据类型 int 时失败。

sql 语句 ,怎么将字符型转换为数字型(整型,浮点型)都行,用啥函数 在线等

将元组条目变量转换为数学问题的 int 的问题

SQL数据库里面显示在将 varchar 值 'S' 转换成数据类型 int 时失败。 下面是存储过程 麻烦看下 是否有错

SQL用交叉报表时报错:在将 varchar 值 'then result else 0 end)' 转换成数据类型 int 时失败。