【问题标题】:SQL Server cast fails with arithmetic overflowSQL Server 强制转换因算术溢出而失败
【发布时间】:2010-05-21 17:15:33
【问题描述】:

根据 SQL Server 2008 联机丛书中的十进制和数字数据类型条目,精度为:

p(精度) 可以存储的小数位数的最大总数,包括小数点的左侧和右侧。精度必须是 1 到最大精度 38 之间的值。默认精度为 18。

但是,下面的第二个选择失败并显示“将 int 转换为数字数据类型的算术溢出错误。”

SELECT CAST(123456789 as decimal(9,0))
SELECT CAST(123456789 as decimal(9,1))

【问题讨论】:

    标签: sql-server precision


    【解决方案1】:

    请看这里:http://msdn.microsoft.com/en-us/library/aa258832(SQL.80).aspx

    十进制[(p[, s])]

    p(精度) 指定小数位数的最大总数 可以存储的,都在左边 和小数点的右边。 精度必须是从 1 开始的值 通过最大精度。这 最大精度为 38。默认值 精度为 18。

    s (scale) 指定最大十进制位数 存储在小数点右边 观点。比例必须是从 0 开始的值 通过 p。只能指定比例 如果指定了精度。默认 比例为 0;因此,0

    使用时:decimal(p,s),将 p 视为您要存储的总位数(无论小数点的左侧或右侧),将 s 视为应存储的 p 位数在小数点右边。

    DECIMAL(10,5)=     12345.12345
    DECIMAL(10,2)=  12345678.12
    DECIMAL(10,10)=         .1234567891
    DECIMAL(11,10)=        1.1234567891
    

    您的示例代码失败:

    SELECT CAST(123456789 as decimal(9,1))
    

    因为:

    9=精度(小数点左右的总位数)
    1=比例(小数点右侧的总位数)
    (9-1)=8(小数点左边的总位数)

    您的值 123456789 需要小数点左侧 9 位。你需要decimal(10,1) 或者只是decimal(9,0)

    【讨论】:

    • 刻度是右边的最大数字——我们遇到了插入问题,导致我们进行了一些测试并得出结论,如果不需要整个刻度,那么 SQL Server 将允许额外的数字p 到小数点的左边。是否有可以改变这种行为的服务器设置?
    • @Jamie Ide 说led us to do some tests and conclude that if the entire scale wasn't needed then SQL Server would allow additional digits up to p to the left of the decimal point。我真的很难相信。 Decimal 数据类型的 Precision 和 Scale 有据可查,没有包括或提及任何例外。我认为你的测试更有可能有问题。发布一个显示此行为的脚本(带有示例数据)。
    • 我想我已经解决了我对此的困惑。我有一个开发人员认为小数(p,s)意味着左边的 p 位,右边的 s。我创建了一个测试表来演示它,在测试过程中,我们都发现 SQL Server 可以按比例计算。不知何故,我们在我的第一条评论中将其混为一谈。
    【解决方案2】:

    正确。由于您正在执行decimal(9,1),这意味着您总共有 9 个数字,但 ,1 将其中一个保留在小数点的右边,所以您最多可以在左边做 8 个,在右边做 1 个。

    【讨论】:

      【解决方案3】:

      试试
      SELECT CAST(123456789 as decimal(10,1))

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多