如何将我的float字段转换为sql server中的Decimal?

时间:2009-09-07 18:59:19

标签: sql sql-server

我想将我的浮点字段转换为十进制字段;我希望在我的十进制字段中精度为11,2,但是当我尝试更改字段的类型(例如:Amount)时,我收到一个错误:“将float转换为数据类型为数字的算术溢出错误。 该声明已被终止。“我的字段在表中为十进制(11,2),我的最大值和最小值为:1,603,837,393.70< - > -1,688,000,000.00(金额)。

我创建了一个临时表来取出数据并更改了我的字段的结构,并且工作了o.k.但现在我需要将数据放回去(临时表仍然具有原始的float字段),而我只是简单地无法使用insert select语句插入值。

由于我的值不超出我的类型范围,我想知道为什么甚至不能在这样的选择语句上进行强制转换:

select Id,AccountId, cast(Amount as decimal(12,2)) as Amount,
cast(AmountB as decimal(12,2)) as  AmountB
FROM myTable

我无法确定不转换字段的原因。

3 个答案:

答案 0 :(得分:5)

但值“1,603,837,393.70”将需要十进制(12,2) - 总共12位,小数点后2位。

也许你误解了decimal(11,2)的工作方式?这意味着总共11位数 - 左侧9位,小数点右侧2位。

请参阅MSDN docs for decimal and numeric types

十进制[(p [,s])]和数字[(p [,s])]

p(精确度)

可以存储的最大小数位数,小数点左侧和右侧

马克

答案 1 :(得分:0)

检查字段类型。他们是对的吗?

答案 2 :(得分:0)

你的问题简直令人困惑。你说“我的字段在表格中是小数(11,2)”,但这与你对max和min值的说法相矛盾,这些值不在十进制范围内(11,2)。如果您引用的错误来自您提供的SELECT查询,则Amount或AmountB的值超出了可以由decimal(12,2)类型表示的值范围:-9,999,999,999.99到9,999,999,999.99。

如果您运行以下查询,您将发现这一点:

select
  min(Amount) as minAmount,
  max(Amount) as maxAmount,
  min(AmountB) as minAmountB,
  max(AmountB) as maxAmountB
from myTable