我想,我可能搞砸了一些历史数据......
我的数据库的值低于存储为float(53)
。(从SSIS转储)
643478425
当我们加入此表时,与其他表一起,我得到了类型转换..
所以我们将列值更改为varchar(100)
,如下所示
alter table dbo.test
alter column colname varchar(100)
现在,所有上述值(643478425
)现在都存储为
6.43478e+008
这不是我想要的..
我尝试过转换,以获得原始价值。
我在下面试过
select cast(6.43478e+008 as float(100)) --gives 643478000
这是不正确的
任何想法
以下是你如何重现
create table #test
(
id float(53)
)
insert into #test
select '643478425'
select * from #test
alter table #test
alter column id varchar(100)
select * from #test
答案 0 :(得分:2)
将其转换为varchar
后,您已经失去了float
精度,而您无法恢复。{1}}精度。根据文档:
用于浮点数字数据的近似数字数据类型。浮点数据是近似值;因此,并非所有数据类型范围内的值都可以准确表示。
正如this answer所示,转换时您可以使用:
返回从数字数据转换的字符数据。
因此,不要改变列,而是创建一个新列并填充如下:
CREATE TABLE #test
(
id FLOAT(53) ,
val NVARCHAR(100)
);
INSERT INTO #test
( id, val )
SELECT 643478425 ,
NULL;
UPDATE #test
SET val = STR(id, 20, 0);
SELECT *
FROM #test;
DROP TABLE #test;
获得:
id val
643478425 643478425
答案 1 :(得分:1)
你不能把猪从香肠中取出来,TheGameiswar。
随着演员表演,你失去了精准度,你无法再回来......
您唯一的机会就是可以再次从SSIS获取数据。
然后,为了支持你想要的连接:数据是数字的,并且看起来完全是INTEGER精度,至少从你的例子开始。
我会将列转换为INTEGER或BIGINT并再次从SSIS获取数据。我还将连接列从其他表转换为INTEGERS:始终尝试连接相同类型的列。
或者,首先转换为INTEGER,然后转换为VARCHAR。