运行此代码时, 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))
一切顺利。
数值数据类型有限制吗?
运行此代码时, 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))
一切顺利。
数值数据类型有限制吗?
数字定义总位数,然后是小数点后的数字。
数字(3,2)最多只能容纳 9.99。
让我们看看,数字(3,2)。这意味着您有 3 个数据位,其中两个在小数点右侧,仅在小数点左侧留下一个。15 在小数点的左边有两位。顺便说一句,如果您可能有 100 作为值,我会将其增加到数字 (5, 2)
NUMERIC(3,2)
表示:共3位,小数点后2位。所以小数点前只有一个小数。
尝试NUMERIC(5,2)
- 前三个,小数点后两个。
精度和规模经常被误解。在 numeric(3,2) 中,您需要总共 3 位数字,但小数点右侧需要 2 位。如果您想要 15 => 15.00,那么前导 1 会导致溢出(因为如果您想要小数点右侧的 2 位数字,则左侧只有一位数字的空间)。使用 4,2 没有问题,因为所有 4 位数字都适合。
很老的问题,但我想我会在这里添加这个以完成:有一个 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