【问题标题】: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))

一切顺利。

数值数据类型有限制吗?

【问题讨论】:

    标签: sql-server variables types numeric


    【解决方案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。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-11
              • 1970-01-01
              相关资源
              最近更新 更多