在SSIS中使用Excel数据源时,每个列的数据类型都是从列中的数据派生的.是否可以覆盖此行为?
理想情况下,我们希望从excel源传递的每个列都是字符串数据类型,以便可以在数据流的后续步骤中对从源接收的数据执行数据验证.
目前,错误输出选项卡可用于忽略转换失败 - 有问题的数据为空,并且包将继续执行.但是,我们想知道原始数据是什么,以便可以为该行生成适当的错误消息.
是的你可以.只需进入Excel源代码的输出列列表,然后为每个列设置类型.
要进入输入列列表,请右键单击Excel源,选择"显示高级编辑器",然后单击标记为"输入和输出属性"的选项卡.
一个可能更好的解决方案是使用派生列组件,您可以在Excel中为每列实际构建"新"列.这有好处
您可以更好地控制转换为的内容.
你可以放入控制变化的规则(即如果null给我一个空字符串,但是如果有数据则给我一个字符串数据)
您的数据源不直接与流程的其余部分绑定(即您可以更改源,并且您需要执行的唯一工作位于派生列中)
根据这篇博客文章,问题是SSIS Excel驱动程序根据读取前8行的值确定每列的数据类型:
如果前8个记录包含相同数量的数字和字符类型 - 则优先级为数字
如果大多数前8个记录都是数字,那么它将数据类型指定为数字,并且所有字符值都读为NULL
如果大多数前8个记录都是字符类型,那么它将数据类型指定为字符串,并将所有数值读取为NULL
这篇文章概述了你可以做的两件事来解决这个问题:
首先,添加IMEX=1
到Excel驱动程序连接字符串的末尾.这将允许Excel将值读取为Unicode.但是,如果前8行中的数据是数字,则这是不够的.
在注册表中,将值更改为HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
0.这将确保驱动程序查看所有行以确定列的数据类型.
如果您的Excel文件在第一行数据中包含相关列中的数字,则SSIS引擎似乎会将类型重置为数字类型.它一直在重置我的.我进入了我的Excel文件,并通过在它们前面放置一个引号将数字更改为"存储为文本的数字".它们现在被视为文本.
我还注意到SSIS使用第一行来IGNORE程序员指示的是数据的实际类型(我甚至告诉Excel将整个列格式化为TEXT,但SSIS仍然使用数据,这是一堆数字) ,并重置它.一旦我通过在我的Excel文件中的第一行数据前面的单引号中修改它,我认为它会正确,但不,还有额外的工作.
实际上,即使SSIS外部数据源列现在具有DT_WSTR类型,它仍将读取43567192为4.35671E + 007.因此,您必须返回Excel文件并在所有数字前面加上单引号.
很漂亮,微软!但是有你的解决方案.如果Excel文件不在您的控制范围内,我不知道该怎么办.