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

How to handle datatype double-precision float [DT_R8] in ssis data flow task

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

    +------------+---------------------------------+
    | 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]。虽然我收到警告说数据类型在执行时需要更改。

但是 none 以上步骤解决了我的问题。

这就是浮动的工作方式。我假设您正在使用某种工具来查看源值:大多数工具将 trim 浮点值(将它们四舍五入以便显示),所以我敢打赌 0.579 实际上是 0.5789999 等等。如果您不知道的话无论如何,浮点值已经不精确了。查看 Wikipedia article,尤其是第 7 节:精度问题。

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

例如:

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