SSIS Excel数据源-是否可以覆盖列数据类型?
在SSIS中使用excel数据源时,每个列的数据类型都是从列中的数据派生的。有可能推翻这种行为吗 理想情况下,我们希望从excel源交付的每个列都是字符串数据类型,以便在数据流的后续步骤中对从源接收的数据执行数据验证SSIS Excel数据源-是否可以覆盖列数据类型?,excel,ssis,Excel,Ssis,在SSIS中使用excel数据源时,每个列的数据类型都是从列中的数据派生的。有可能推翻这种行为吗 理想情况下,我们希望从excel源交付的每个列都是字符串数据类型,以便在数据流的后续步骤中对从源接收的数据执行数据验证 目前,ErrorOutput选项卡可用于忽略转换失败-相关数据为空,包将继续执行。但是,我们想知道原始数据是什么,以便为该行生成适当的错误消息。是的,您可以。只需进入Excel源上的输出列列表,并为每个列设置类型 要进入“输入列”列表,请右键单击Excel源,选择“显示高级编辑器”
目前,ErrorOutput选项卡可用于忽略转换失败-相关数据为空,包将继续执行。但是,我们想知道原始数据是什么,以便为该行生成适当的错误消息。是的,您可以。只需进入Excel源上的输出列列表,并为每个列设置类型 要进入“输入列”列表,请右键单击Excel源,选择“显示高级编辑器”,单击标记为“输入和输出属性”的选项卡 一个可能更好的解决方案是使用派生列组件,您可以在其中为Excel中的每一列实际构建“新”列。这具有以下优点:
如果Excel文件的第一行数据中有问题的列中包含一个数字,则SSIS引擎似乎会将该类型重置为数字类型。它一直在重置我的。我进入我的Excel文件,将数字改为“以文本形式存储的数字”,方法是在数字前面加上一个引号。它们现在作为文本阅读 我还注意到,SSIS使用第一行忽略程序员指出的数据的实际类型(我甚至告诉Excel将整个列格式化为文本,但SSIS仍然使用数据,这是一堆数字),然后将其重置。一旦我在Excel文件中的第一行数据前面加上一个引号,我就认为这样做是正确的,但是没有,还有额外的工作要做 事实上,即使SSIS外部数据源列现在具有DT_WSTR类型,它仍将43567192读取为4.35671E+007。因此,您必须返回Excel文件,在所有数字前加上单引号
很差劲,微软!但这是你的解决方案。如果Excel文件不在您的控制之下,我不知道该怎么办。您可以使用数据转换组件转换为所需的数据类型。我在这里实现解决方案时遇到了问题-我可以按照说明操作,但它只会产生新的错误 我通过使用数据转换实体解决了转换问题。这可以在SSIS工具箱的“数据流转换”下找到。我将数据转换放在Excel源和OLE DB目标之间,将Excel链接到数据C,将数据C链接到OLE DB,双击数据C以显示数据列列表。为问题列提供了新别名,并更改了数据类型列
最后,在OLE DB目标的映射中,使用别名列名,而不是原始Excel列名。工作完成。Excel源代码是SSIS行为疯狂。SSIS通过读取前10行来确定particualr列中的数据类型。。这就是问题所在。如果在前10个ROE中有一个文本列的值为null,SSIS将数据类型设置为Int
我知道它有点破旧,但它可以工作:)我可以解决这个问题。在创建SSIS包时,我手动将特定列更改为文本(打开excel文件选择列,右键单击列,选择格式单元格,在数字选项卡中选择文本并保存excel)。 现在创建SSIS包并对其进行测试。它起作用了。现在尝试使用excel文件,其中该列未设置为文本 它为我工作,我可以成功地执行包 根据,问题在于SSIS Excel驱动程序根据前8行的读取值确定每列的数据类型:
- 如果前8条记录包含相同数量的数字和字符类型,则优先级为数字
- 如果前8条记录中的大多数是数字,则它将数据类型指定为数字,并且所有字符值都读取为空
- 如果前8条记录中的大多数是字符类型,则它将数据类型指定为字符串,所有数值都读取为字符串 空值
IMEX=1
添加到Excel驱动程序连接字符串的末尾。这将允许Excel以Unicode格式读取值。但是,如果前8行中的数据是数字,这是不够的HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
的值更改为0。这将确保驱动程序查看所有行以确定列的数据类型我正在寻找类似问题的解决方案,但在互联网上找不到任何东西。尽管找到的大多数解决方案都在设计时工作,但当您想要自动化SSIS包时,它们就不工作了 我解决了这个问题,并通过更改
Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$]