【问题标题】:How to handle datatype double-precision float [DT_R8] in ssis data flow task如何在 ssis 数据流任务中处理数据类型双精度浮点数 [DT_R8]
【发布时间】:2015-08-19 11:28:14
【问题描述】:

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

但是以上步骤都没有解决我的问题。

【问题讨论】:

    标签: sql sql-server ssis


    【解决方案1】:

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

    例如:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的.. 但是我如何得到在目标数据库列中输入的源数据库的确切内容??
      猜你喜欢
      • 2015-02-20
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多