SSIS Excel数据源 – 是否可以重写列数据types?

当在SSIS中使用Excel数据源时,每个单独列的数据types都是从列中的数据派生而来的。 是否有可能重写这种行为?

理想情况下,我们希望从Excel源传递的每一列都是string数据types,这样数据validation可以在数据stream的后续步骤中对从源接收的数据执行。

目前,“错误输出”选项卡可用于忽略转换失败 – 所涉及的数据为空,并且程序包将继续执行。 但是,我们想要知道原始数据是什么,以便可以为该行生成适当的错误消息。

是的你可以。 只要进入Excel来源的输出栏列表,并设置每个栏的types。

要进入input栏列表,请右键单击Excel源,select“显示高级编辑器”,单击标签为“input和输出属性”的选项卡。

一个可能更好的解决scheme是使用派生列组件,您可以在其中为Excel中的每个列实际构build“新”列。 这有好处

  1. 您可以更好地控制转换的内容。
  2. 你可以放入控制变化的规则(也就是说,如果null给了我一个空string,但是如果有数据,那么把数据作为一个string给我)
  3. 你的数据源并没有直接绑定到进程的其余部分(即你可以改变源代码,唯一需要做的工作是在派生列中)

根据这篇博文 ,问题是SSIS Excel驱动程序根据前8行的读取值确定每列的数据types:

  • 如果前8个logging包含相同数量的数字和字符types – 那么优先级是数字
  • 如果前8个logging的大部分都是数字,那么它将数据types指定为数字,并将所有字符值读取为NULL
  • 如果大多数前8个logging是字符types,那么它将数据types指定为string,并将所有数值读取为NULL

这篇文章概述了两件事你可以做的解决这个问题:

  1. 首先,将IMEX=1添加到Excel驱动程序连接string的末尾。 这将允许Excel以Unicode读取值。 但是,如果前8行中的数据是数字,这是不够的。
  2. 在registry中,将HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows更改为0.这将确保驱动程序查看所有行以确定该列的数据types。

如果您的Excel文件在第一行数据中的问题列中包含一个数字,那么似乎SSIS引擎会将该types重置为数字types。 它不断地重置我的。 我进入我的Excel文件,并通过在他们面前放置一个单引号将数字更改为“数字存储为文本”。 现在他们被读作文本。

我还注意到,SSIS使用第一行IGNORE程序员已经指出的是数据的实际types(我甚至告诉Excel将整列格式化为TEXT,但SSIS仍然使用数据,这是一堆数字) ,并重置它。 一旦我通过在我的Excel文件中的第一行数据前面加一个单引号来解决这个问题,我认为这样做是正确的,但不是,还有额外的工作。

实际上,即使SSIS外部数据源列现在具有DT_WSTRtypes,它仍将以4.35671E + 007的forms读取43567192。 所以你必须回到你的Excel文件,并把所有的数字前面的单引号。

漂亮的LAME,微软! 但是有你的解决scheme。 我不知道该怎么办,如果Excel文件不受你的控制。

Excel来源是SSISperformance疯狂。 SSIS通过读取前10行来确定特定列中的数据types。因此,这个问题。 如果您在前10个roes中具有空值的文本列,则SSIS将数据types视为Int。 经过一番斗争,这是一个解决方法

  1. 在工作表中插入一个虚拟行(最好是第一行)。 我更喜欢通过脚本任务来做这件事,你可以考虑使用一些服务在SSIS连接到它之前预处理文件

  2. 有了这个愚蠢的行,你肯定会根据需要设置数据types

  3. 使用Excel源代码读取数据,并在进行进一步处理之前过滤出虚拟行。

我知道这是有点破旧,但它的作品:)

我可以解决这个问题。 在创buildSSIS包的同时,我手动将特定的列更改为文本(打开excel文件select列,右键单击列,select格式单元格,在数字标签中selectText并保存为Excel)。 现在创buildSSIS包并进行testing。 有用。 现在尝试使用该列未被设置为文本的Excel文件。

它为我工作,我可以成功地执行包。

我正在寻找类似的问题的解决scheme,但没有在互联网上find任何东西。 虽然大多数find的解决scheme在devise时都能正常工作,但当您想要自动化您的SSIS包时,这些解决scheme无法正常工作。

我解决了这个问题,并通过更改“Excel Source”的属性来使其工作。 默认情况下, AccessMode属性设置为OpenRowSet 。 如果将其更改为SQL Command ,则可以编写自己的SQL来根据需要转换任何列。

对我来说,SSIS将NDCCode列当作float来处理,但是我需要它作为一个string,所以我使用了下面的SQL:

 Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$] 

在这里输入图像说明

在这里输入图像说明

我在这里实施解决scheme时遇到了困难 – 我可以按照说明进行操作,但是只会产生新的错误。

我通过使用数据转换实体解决了我的转换问题。 这可以在数据stream转换下的SSIS工具箱中find。 我将Excel Source和OLE DB Destination之间的数据转换,将Excel链接到Data C,将Data C链接到OLE DB,双击Data C打开数据列表。 给问题列一个新的别名,并更改了数据types列。

最后,在OLE DB目标的映射中,使用别名列名称,而不是原始Excel列名称。 任务完成。

您可以使用数据转换组件转换为所需的数据types。