SQL Server强制转换因算术溢出而失败

时间:2010-05-21 17:15:33

标签: sql-server precision

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

  

p(精度)   小数点左侧和右侧可存储的最大小数位数。精度必须是从1到最大精度为38的值。默认精度为18。

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

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

3 个答案:

答案 0 :(得分:9)

见这里: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的多少位数那些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)

答案 1 :(得分:4)

正确。由于您正在执行decimal(9,1),这意味着您有9位总数,但,1在小数点右侧保留了其中一位数,因此您最多只能在左侧8位和1位在右边。

答案 2 :(得分:0)

尝试
    SELECT CAST(123456789为十进制(10,1))