【发布时间】:2019-05-03 13:35:11
【问题描述】:
我在我们的 SQL 服务器 (2016 SP2 CU6) 上的 SSIS 中运行了一个 dtsx 包,它是将 Excel (xlsx) 工作表按原样导入 SQL 表中的轻量级任务,在这个阶段不需要转换,有是一个代理工作,它围绕它做更多的事情,但我可以看到错误发生在这一部分。
我看到的问题是 Excel 中的数字 (0.0153) 在 SQL 中出现,好像转换错误 (1.5299999999999999E-2)。
要确认 Excel 中的数字是 0.0153,而不是更长的数字或格式如下所示。
导入后这是我所拥有的:-
我觉得这很奇怪:-
- 他们的处境非常相似,但结果却不同
- 它们在 Excel 工作表中一个接一个
- 它们位于工作表顶部附近(第 10 行和第 11 行),因此如果发生类似情况,采样应该使用它们来了解数据类型(第 1 行是
0.193841,这也是相似的,总体范围是-29 到 200,最多 7 位小数) - 它们之间只有 0.0021 的差异
Excel中的数字格式为General,SQL中的列为NVARCHAR(255)
在 SSIS 包中,External Column 的 Excel 源数据类型被归类为 double-precision float [DT-R8](不确定它来自哪里,但我无法更改它)和 输出列为Unicode string [DT-WSTR]
然后我使用Native OLE DB\SQL Server Native Client 11.0 OLD DB Connection 到达餐桌。
它是一个简单的包,但为什么这个值会如此疯狂地跳跃。它不是一次性的,输入有大约 1700 行,我们在许多行上看到了这一点。
【问题讨论】:
-
您的数据库中
SBU_ANAL_FIELD_5列的数据类型是什么?为什么将数据类型更改为DT_WSTR,而它是一个数值? -
科学记数法并不意味着它被“糟糕”地转换了。无论如何,为什么要将数字存储为字符串?
-
Excel 使用浮点数存储数字,
0.0153无法准确表示。 Excel 肯定会尽其所能假装这是一个精确值,但事实并非如此。除非您的列实际上是文本(即生成值的表达式是"0.0153"),否则您将获得一个浮点数,您可以将其舍入到所需的精度,或者使用FLOAT类型目标列,以便此舍入可以进一步推迟到客户端处理它时。 -
当我读到“导入 Excel 电子表格的轻量级任务”时,我笑出声来。如果可以的话,首先将其保存为管道或制表符分隔文件,这样您的头痛就会减少 100%。这是我能在这里提供的最好建议。尝试从 Excel 中提取数据时有一千个“陷阱”。 Excel 不是一个可行的数据源。
-
@JeroenMostert,是的,
IMEX=1可以在这里提供帮助,但需要记住的是,使用它本质上是在用一堆蛇换另一个,不同但不是更令人愉快的蛇。特别是,任何类型的单元格格式都将进入临时表 - 想想国家特定的货币符号、千位分隔符、会计格式,你可以命名它。
标签: sql sql-server ssis