78

运行此代码时, 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))

一切顺利。

数值数据类型有限制吗?

4

5 回答 5

152

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

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

于 2010-01-13T18:21:11.863 回答
31

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

于 2010-01-13T18:21:34.160 回答
21

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

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

于 2010-01-13T18:21:52.157 回答
18

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

于 2010-01-13T18:22:01.867 回答
0

很老的问题,但我想我会在这里添加这个以完成:有一个 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

还有另一种设置方法: 属性页

于 2021-08-25T16:21:55.737 回答