我想将我的浮点字段转换为十进制字段;我希望在我的十进制字段中精度为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
我无法确定不转换字段的原因。
答案 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