将float转换为varchar会导致值丢失

时间:2017-02-24 11:05:19

标签: sql sql-server

我想,我可能搞砸了一些历史数据......

我的数据库的值低于存储为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

2 个答案:

答案 0 :(得分:2)

将其转换为varchar后,您已经失去了float精度,而您无法恢复。{1}}精度。根据文档:

float and real (Transact-SQL)

  

用于浮点数字数据的近似数字数据类型。浮点数据是近似值;因此,并非所有数据类型范围内的值都可以准确表示。

正如this answer所示,转换时您可以使用:

STR (Transact-SQL)

  

返回从数字数据转换的字符数据。

因此,不要改变列,而是创建一个新列并填充如下:

 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。