我正在将数据从一个表迁移到一个新表。旧表使用FLOAT,在新表中我使用DECIMAL作为字段属性。
我正在使用以下声明: CAST(OLD_COLUMN_NAME为DECIMAL(9,2)AS'NE NEW_COLUMN_NAME'
在我遇到路面碰撞之前就像魅力一样。旧数据定义为float,null,新字段定义为decimal(5,5)。据我所知,十进制(5,5)将需要5个位置后面的所有数据。只是想知道它们是否能够解决将数据从浮点数据字段移动到十进制数据字段的问题。
来自旧字段的输入数据是变化的,如下所示:5,0.5,0.5,0.75,2等等。
我收到的错误是:
消息8115,级别16,状态6,行8算术溢出错误将float转换为数据类型numeric。语句已终止。
该代码使用SQL SERVER 2008对SQL SERVER 2005数据库。不确定这很重要,但我想我会包含这些信息。
有人可以解释如何解决此数据转换问题吗?谢谢!
答案 0 :(得分:2)
Decimal(5, 5)
只有一个范围 - 0.99999到+ 0.99999
但您说您正试图将5
和2
放入其中。您需要Decimal(10, 5)
吗?
如果不是,你确实留下了一点难题。
我提到以下是一个兴趣点,而不是一个严肃的建议,但是,谁知道,它可能有用!
如果列可以为空,那么填写你的老板要求的方法就是
create table #t (j int,i Decimal(5, 5) null)
set ansi_warnings off
set arithabort off
insert into #t values(1,0.2345678)
insert into #t values(2,10)
insert into #t values(3,0.455464)
select * from #t
输出
Arithmetic overflow occurred.
j i
----------- ------------------------------
1 0.23457
2 NULL
3 0.45546
答案 1 :(得分:1)
我建议做这样的事情。
Cast(Round(field, 5) As Decimal(5, 5))
答案 2 :(得分:1)
你的老板是否理解小数点(5,5)不允许小数点左边的任何内容?
用简单的英语问你的老板他/她想要什么。如果你的老板真的要求你存储大于.99999的数字,但特别坚持“十进制(5,5)”,那么显然他们不明白他们要求的是什么。十进制中的第一个“5”(5,5)是指数字中的总位数(合并前后)