十进制的SSIS数据转换问题

时间:2019-05-03 13:35:12

标签: sql sql-server ssis

我在SQL Server(2016 SP2 CU6)的SSIS中运行了一个dtsx程序包,它的轻量级任务是将Excel(xlsx)工作表按原样导入到SQL表中,在此阶段无需进行任何转换,是一个代理工作,它可以做很多事情,但是我可以看到错误仅在本节中发生。

我看到的问题是Excel中的数字(0.0153)在SQL中出现,好像转换得不好(1.5299999999999999E-2)。

要确认Excel中的数字为0.0153,而不是更长或没有格式的数字。

Both values are just 6 characters in length, formula bar shows actual value

导入后,这就是我所拥有的--

Both values show in SQL

我觉得这很奇怪:-

  • 它们的情况都非常相似,但结果却不同
  • 在Excel工作表中,它们是一个接一个的
  • 它们在工作表的顶部(第10和11行)附近,因此,如果发生类似的事情(第1行是0.193841,这在总体上也很相似),则应使用采样来了解数据类型范围是-29到200,最多7个小数位)
  • 它们之间只有0.0021的差异

Excel中的数字格式为General,SQL中的列为NVARCHAR(255)

在SSIS包中,外部列的Excel源数据类型被归类为double-precision float [DT-R8](不确定它来自何处,但我无权对其进行更改)和< em>输出列为Unicode string [DT-WSTR]

然后我正在使用Native OLE DB\SQL Server Native Client 11.0 OLD DB Connection来访问表。

这是一个简单的程序包,但是为什么这个值如此之大。它不是一次关闭,输入大约有1700行,我们在许多行上都看到了这一点。

Package layout

1 个答案:

答案 0 :(得分:4)

在公司环境中,我们不能总是选择源和目标数据,有时我们只需要“使其工作”即可。 Excel尤其是SSIS中的一场噩梦,它所要做的就是对输入文件进行一次错误的更改,并且由于元数据不再匹配,您的工作失败了。

是的,理想情况下,这是数字数据,应存储在数字数据字段(而不是字符串/字符字段)中。

这是我过去完成此方案的方式,希望它能适合您的情况,但实际上取决于所得数据的用途。

  1. 在数据流任务中添加一个“数据转换”步骤,以将双精度浮点值转换为十进制值(我使用scale = 10)

Data Flow Task Data Conversion - to Decimal  2.添加第二个数据转换步骤,将十进制值转换回Unicode字符串

Data Conversion - to String  3.更改您的OLE DB目标映射,以使用第二个数据转换任务中的新输出列。

Column mapping

结果:

Database result