如何在ssis数据流任务中处理数据类型双精度浮点[DT_R8]

时间:2015-08-19 11:28:14

标签: sql sql-server ssis

我正在进行SSIS数据流任务,我需要将数据从一个sql数据库传输到另一个sql数据库。 SQL中的源数据库列数据类型为float,而ssis为double-precision float [DT_R8]。 目标列数据类型为Varchar(50)。当我执行数据流时,传输到目标表的数据与源数据不同,例如:

    +------------+---------------------------------+
    | SourceValue| DestinationValue After execution|
    +------------+---------------------------------+
    | 0.579      | 0.578999999999999965            |
    | 0.637      | 0.63700000000000001             |
    | 0.503      | 0.503                           |
    +------------+---------------------------------+

因此,对于某些值,其他值相同但不同。 我尝试了3种方法来解决这个问题: -

  1. 尝试将查询转换为cast(col as varchar)
  2. 尝试施放为浮动cast(col as float)
  3. 尝试在SSIS目标列中更改与源相同的数据类型,即。 double-precision float [DT_R8]。虽然我收到警告,数据类型需要在执行时更改。
  4. 但上述步骤都没有解决我的问题。

2 个答案:

答案 0 :(得分:4)

我找到了解决方案,在源流程中我已将数据类型从double-precision float [DT_R8]更改为DT_DECIMAL。它的工作正常,值将按原样传输到目标表。

例如:

+------------+---------------------------------+
    | SourceValue| DestinationValue After execution|
    +------------+---------------------------------+
    | 0.579      | 0.579                           |
    | 0.637      | 0.637                           |
    | 0.503      | 0.503                           |
    +------------+---------------------------------+

答案 1 :(得分:0)

这是float的工作方式。我假设您正在使用一些工具来查看源值:大多数工具将修剪浮动值(围绕它们显示),所以我敢打赌0.579实际上是0.5789999等等。如果您还不知道,浮点值无论如何都不准确。看一下Wikipedia article,特别是第7节:准确性问题。