首页 > 解决方案 > SSIS数据转换十进制问题

问题描述

我有一个 dtsx 包在我们的 SQL 服务器(2016 SP2 CU6)上的 SSIS 中运行,它是一项轻量级任务,将 Excel(xlsx)工作表按原样导入 SQL 表中,现阶段不需要转换,有一个代理围绕它做更多工作的工作,但我可以看到故障仅发生在本节中。

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

确认 Excel 中的数字是0.0153不是更长或格式如下所示。

两个值的长度都只有 6 个字符,公式栏显示实际值

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

两个值都显示在 SQL 中

我觉得这很奇怪: -

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

在 SSIS 包中,外部列的 Excel 源数据类型被归类为double-precision float [DT-R8](不确定它来自哪里,但我无法更改它)并且输出列Unicode string [DT-WSTR]

然后,我使用Native OLE DB\SQL Server Native Client 11.0OLD DB Connection 到达表。

它是一个简单的包,但为什么这个值会如此疯狂地跳跃。它不是一次性的,输入有大约 1700 行,我们在许多行上看到了这一点。

包装布局

标签: sqlsql-serverssis

解决方案


在企业环境中,我们不能总是选择源数据和目标数据,有时我们只需要“让它工作”。Excel 尤其是 SSIS 中的噩梦,只需对输入文件进行一次错误更改,您的工作就会失败,因为元数据不再匹配。

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

这就是我过去完成此场景的方式,希望它适用于您的情况,但实际上取决于生成的数据将用于什么。

  1. 在数据流任务中添加数据转换步骤,将双精度浮点值转换为小数(我使用了 scale=10)

数据流任务 数据转换 - 到十进制 2. 添加第二个数据转换步骤,将十进制值转换回 Unicode 字符串

数据转换 - 到字符串 3. 更改您的 OLE DB 目标映射以使用来自第二个数据转换任务的新输出列。

列映射

结果:

数据库结果


推荐阅读