在SSIS中使用Excel数据源时,每个列的数据类型都是从列中的数据派生的。是否可以覆盖此行为?
理想情况下,我们希望从excel源提供的每个列都是字符串数据类型,以便可以在数据流的后续步骤中对从源接收的数据执行数据验证。
目前,“错误输出”选项卡可用于忽略转换失败 - 有问题的数据为空,并且包将继续执行。但是,我们想知道原始数据是什么,以便可以为该行生成适当的错误消息。
答案 0 :(得分:10)
是的,你可以。只需进入Excel源代码的输出列列表,然后为每个列设置类型。
要进入输入列列表,请右键单击Excel源,选择“显示高级编辑器”,然后单击标记为“输入和输出属性”的选项卡。
一个可能更好的解决方案是使用派生列组件,您可以在Excel中为每列实际构建“新”列。这有以下好处
答案 1 :(得分:9)
根据this blog post,问题是SSIS Excel驱动程序根据读取前8行的值确定每列的数据类型:
- 如果前8个记录包含相同数量的数字和字符类型 - 则优先级为数字
- 如果大多数前8个记录都是数字,那么它会将数据类型指定为数字,并且所有字符值都将读为NULL
- 如果大多数前8个记录都是字符类型,那么它将数据类型指定为字符串,所有数值都被读取为 空值
这篇文章概述了你可以做的两件事来解决这个问题:
IMEX=1
添加到Excel驱动程序连接字符串的末尾。这将允许Excel将值读取为Unicode。但是,如果前8行中的数据是数字,则这还不够。HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
的值更改为0.这将确保驱动程序查看所有行以确定列的数据类型。答案 2 :(得分:7)
如果您的Excel文件在第一行数据中包含相关列中的数字,则SSIS引擎似乎会将类型重置为数字类型。它一直在重置我的。我进入了我的Excel文件,并通过在它们前面放置一个引号将数字更改为“存储为文本的数字”。它们现在被视为文本。
我还注意到SSIS使用第一行来IGNORE程序员指示的是数据的实际类型(我甚至告诉Excel将整个列格式化为TEXT,但SSIS仍然使用数据,这是一堆数字),并重置它。一旦我通过在第一行数据中的数字前面的Excel文件中添加单引号来修复它,我认为它会正确,但不,还有额外的工作。
实际上,即使SSIS外部数据源列现在具有DT_WSTR类型,它仍将读取43567192为4.35671E + 007。因此,您必须返回Excel文件并在所有数字前面加上单引号。
漂亮的名字,微软!但是有你的解决方案。如果Excel文件不在您的控制范围内,我不知道该怎么办。
答案 3 :(得分:2)
Excel源码是SSIS表现得很疯狂。 SSIS通过读取前10行来确定特定列中的数据类型。因此问题。如果在前10个roes中有一个包含空值的文本列,则SSIS将数据类型作为Int。经过一番努力,这是一个解决方法
在工作表中插入一个虚拟行(最好是第一行)。我更喜欢通过脚本任务执行此操作,您可以考虑使用某些服务在SSIS连接之前预处理文件
使用duummy行,您确定将根据需要设置数据类型
使用Excel源读取数据并过滤掉虚拟行,然后再进行进一步处理。
我知道它有点破旧,但它有效:)
答案 4 :(得分:2)
我正在寻找类似问题的解决方案,但在互联网上找不到任何东西。虽然大多数找到的解决方案在设计时都有效,但是当您想要自动化SSIS包时,它们不起作用。
我解决了这个问题并通过更改" Excel来源"的属性使其工作。默认情况下,AccessMode
属性设置为OpenRowSet
。如果将其更改为SQL Command
,则可以编写自己的SQL以根据需要转换任何列。
对我来说,SSIS将NDCCode
列视为float,但我需要它作为字符串,因此我使用了以下SQL:
Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$]
答案 5 :(得分:0)
我可以解决这个问题。在创建SSIS包时,我手动将特定列更改为文本(打开excel文件选择列,右键单击列,选择格式单元格,在数字选项卡中选择文本并保存excel)。 现在创建SSIS包并进行测试。有用。现在尝试使用未将此列设置为文本的excel文件。
它对我有用,我可以成功执行包。
答案 6 :(得分:0)
这应该简单地解决,只需取消选中“第一个行作为列名”框,所有数据将作为文本数据类型收集。此选择的唯一缺点是,您必须从自动名称(列1、2等)中管理列名称,并处理包含列名称的第一行。
答案 7 :(得分:-1)
我在这里实施解决方案时遇到了问题 - 我可以按照说明操作,但它只会产生新的错误。
我使用数据转换实体解决了转换问题。这可以在数据流转换下的SSIS工具箱中找到。我将数据转换放在我的Excel源和OLE DB目标之间,将Excel链接到数据C,将数据C链接到OLE DB,双击数据C以显示数据列的列表。给问题列添加了一个新的别名,并更改了“数据类型”列。
最后,在OLE DB目标的映射中,使用别名列名称,而不是原始Excel列名称。完成工作。
答案 8 :(得分:-2)
您可以使用数据转换组件转换为所需的数据类型。