导入Excel数据似乎随机给出了空值

时间:2019-05-29 23:32:59

标签: sql-server excel ssis ssis-2017

使用SSIS for Visual Studio 2017导入一些excel文件。

我创建了一个包含多个循环容器的程序包,这些循环容器调用特定的程序包来处理某些文件。我在执行一个特定的程序包时遇到问题,因为它似乎随机决定每个excel文件的列数据为NULL。我/我的印象是,这是位于

TypeGuessRows(最初更改为0,然后更改为1000,作为测试)的注册表设置的一部分。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel

我认为这是因为引入的各种文件通常具有相同的数据,但是似乎如果源数据中列的前几行仅包含数字,则具有混合值的数据将不会正确引入。除此以外的所有其他列似乎都很好。

查看源文件,所有文件都具有相同的数据类型。 我尝试更改注册表TypeGuessRows的值,并确保输出列属性是基于字符串的,而不是基于数字的。 连接字符串具有IMEX=1

2 个答案:

答案 0 :(得分:1)

此问题与用于读取excel文件的OLEDB提供程序有关:由于excel不是每个列都有特定数据类型的数据库,因此OLEDB提供程序尝试识别在每个列中找到的主要数据类型并替换所有其他数据不能用NULL解析的类型。

网上有很多文章讨论此问题,并提供了几种解决方法(下面列出的链接)

但是在使用SSIS多年之后,我可以说最佳实践是将excel文件转换为csv文件并使用平面文件组件读取它们

或者,如果您没有选择将excel转换为平面文件,则可以强制excel连接管理器忽略第一行中的标头,而是在连接字符串中添加HDR=NO并添加{{1} }告诉OLEDB提供者从第一行(这是标题-大部分时间是所有字符串)中指定数据类型,在这种情况下,所有列均作为字符串导入,并且没有任何值被替换为NULL,但您将丢失标头和另一行(已导入标头行)。

如果您不能忽略标题行,只需在标题行之后添加包含伪字符串值(例如:IMEX=1的伪行,然后将aaa添加到连接字符串。

有用的链接

答案 1 :(得分:1)

所以我修复了它。或者至少找到了一个足够的解决方法,该方法可以帮助我遇到的任何情况。我认为与SSIS的缓存有关。 我最终在问题列上放置了一个排序函数,因此,由于具有随机数据类型而被读取为NULL的记录首先被读取,而不是被视为随机的。我会说,我最初尝试过此方法,但没有用。 通过在同一个程序包中进行新数据流的小实验,我发现此解决方案确实有效,因此我认为缓存是问题所在。 如果有人对此还有其他疑问,请告诉我。