如何在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 种方法来解决这个问题:-
- 试图将查询转换为
cast(col as varchar)
- 尝试转换为浮点数
cast(col as float)
- 试图更改 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 |
+------------+---------------------------------+
我正在执行 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 种方法来解决这个问题:-
- 试图将查询转换为
cast(col as varchar)
- 尝试转换为浮点数
cast(col as float)
- 试图更改 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 |
+------------+---------------------------------+