2

使用 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

4

2 回答 2

1

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

于 2019-06-06T19:31:04.610 回答
0

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

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

但是在使用 SSIS 多年之后,我可以说最佳做法是将 excel 文件转换为 csv 文件并使用 Flat File components 读取它们

或者,如果您没有选择将 excel 转换为平面文件,那么您可以强制 excel 连接管理器忽略第一行的标题,但添加HDR=NO到连接字符串并添加IMEX=1以告诉 OLEDB 提供程序从第一个指定数据类型行(这是标题 - 大多数时间都是字符串),在这种情况下,所有列都作为字符串导入,并且没有值被 NULL 替换,但是您将丢失标题和额外的行(标题行被导入)。

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

有用的网址

于 2019-05-30T01:13:33.343 回答