代码之家  ›  专栏  ›  技术社区  ›  Jamie Ide

SQL Server强制转换失败,出现算术溢出

  •  2
  • Jamie Ide  · 技术社区  · 14 年前

    根据SQL Server 2008联机丛书中的decimal和numeric数据类型条目,精度为:

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

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

    SELECT CAST(123456789 as decimal(9,0))
    SELECT CAST(123456789 as decimal(9,1))
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   KM.    14 年前

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

    小数点[(P[,S])]

    P(精度) 指定小数位数的最大总数 可以存储在左侧 在小数点的右边。 精度必须是1的值 通过最大精度。这个 最大精度为38。默认值 精度为18。

    S(比例尺) 指定小数位数的最大值 存储在小数点右边 点。刻度必须是0的值 通过P.比例只能指定 如果指定了精度。默认值 比例为0;因此,0<=s<=p。 最大存储大小根据 精度。

    使用时: decimal(p,s) 想想 p 您要存储的总位数(不考虑小数点的左或右),以及 s 多少个呢 数字应该在小数点的右边。

    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)

        2
  •  4
  •   Donnie    14 年前

    对的。既然你这么做了 decimal(9,1) 这意味着你总共有9个数字,但是 ,1 保留其中一个小数点后的右边,因此您最多可以向左8,向右1。

        3
  •  0
  •   VoodooChild    14 年前

    尝试
    选择CAST(123456789,十进制(10,1))。