SSIS Excel导入强制不正确的列types
我试图使用SSIS将电子表格导入到我们的数据库。 出于某种原因,SSIS希望在包含字符数据时相信其中的两列是Doubletypes的。 我已经尝试重新映射列为nvarchar(255),但它仍然不想select它认为是双重的数据,因为它有字符。 如果我尝试编辑SSIS包并更改Excel Source中的列types,它将不会让我更改错误输出中的列的types,并且如果常规输出和错误输出列不会更改错误比赛。
为什么SSIS坚持这些列是双? 我怎么能强迫它意识到这些是string? 为什么从微软的一切都不能正常工作?
编辑:我发现这个: http : //support.microsoft.com/kb/236605
我sorting我的数据,以便混合的数据types将在顶部,并猜测是什么:问题逆转 。 它不是不导入字符数据,而是停止导入纯数字数据。 显然有人不认为12345可以表示为一个string…
我以前见过这个问题,这是Excel问题,而不是SSIS。 Excel对前几行进行采样,然后即使将其显式设置为文本,也会推断数据types。 你需要做的是把它放到SSIS包中的Excel文件连接string中。 这个指令告诉Excel列中包含混合的数据types,并提示它做额外的检查,然后再决定该列是一个数字types,而事实上并不是这样。
;Extended Properties="IMEX=1"
它应该与此(在大多数情况下)。 要做的更安全的事情是将Excel数据导出到制表符分隔的文本并使用SSIS导入。
你可以转换(即强制)列数据为文本…试试这个(注意:这些说明是基于Excel 2007)…
以下步骤应强制Excel将该列作为文本处理:
使用Excel打开电子表格。
点击列标题,select包含“主要是数字数据”的整个列。
单击function区菜单上的数据选项卡。
select文本到列。 这将打开“将文本转换为列向导”。
在步骤1:单击下一步
– 在步骤2:单击下一步
在步骤3:select文本,然后单击完成
保存您的Excel工作表。
使用SQL Server 2005导入数据向导重试导入。
另外,下面是另一个问题的链接,其中有额外的答复:
导入数据向导不像我为列select的数据types
在接受的答案中没有提到的一件事是,“IMEX = 1”参数必须在引用部分:
...;Extended Properties="...";
; IMEX = 1; 并不总是正常工作…在Excel中混合数据types的一切: Excel列中的混合数据types
另一个解决方法是使用顶部的字符数据对电子表格进行sorting,从而导致Excel将字段视为string,并导入所有内容。
您也可以改变registry来查看比前8行更多的值。 我已经使用这种方法,工作得很好。
那么IMEX = 1不适合我。 Reynier Booysen的build议也没有。 (我不知道它是否有所作为,但我使用SQL Server 2008r2)。 有关某些解决方法的一个很好的解释以及为什么IMEX = 1仅限于每个电子表格的前八行,可以在http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread / 78b87712-8ffe-4c72-914b-f1c031ba6c75
希望这可以帮助
我已经使用了下面的配方:
- 从Excel导入数据到Access
- 将数据从Access导入到SQL Server
它为我工作…
这个问题让我头撞墙。 在我们的环境中,我们以各种格式从我们的供应商那里获取价格文件,其中一些格式有上百万条logging。 这个问题通常发生在:
- 由OLEDB驱动程序扫描的行似乎包含数字,但在logging集中或之后包含混合值
- 字段确实只包含数字,但源代码有一些格式化为文本(通常是Excel文件)。
问题是,即使将外部input列设置为所需的数据types,也会在每次运行程序包时扫描文件,并dynamic更改为OLEDB驱动程序认为该字段应为的任何内容。
我们的源文件通常包含字段标题(文本)和价格(数字字段),这给了我一个简单的解决scheme:
第一步:
- 更改您的SQL语句以包含标题字段。 这迫使SSIS将所有字段视为文本,包括价格字段。
对于混合领域:
- 您最初的问题已经解决,因为您的字段现在是文本,但您的输出中仍然有一个标题行。
- 通过更改SQL WHERE子句来排除标题值,例如“WHERE NOT([F4] ='Price')”,防止标题行进入输出
对于数字字段:
-
使用OLE DB源的高级编辑器,将价格字段(或任何其他数字字段)的输出列设置为数字数据types。 这会导致包含这些字段中的文本的任何logging失败(包括标题logging),但强制将数字值转换为保存为文本。
-
设置错误输出以忽略数字字段上的故障。
-
或者,如果在redirect的数字字段上仍然需要任何错误,请通过更改SQL WHERE子句来排除标题值,然后删除标题行,
- 设置错误输出以在该字段上redirect失败。
显然这种方法只适用于你有头字段,但希望这可以帮助你们中的一些人。
选项1.使用Visual Basic遍历每列,并将每列设置为文本格式。
使用“文本到列”菜单,不要更改删除,并将“常规”更改为“文本”
我有同样的问题。 该问题在Excel源任务。 当您第一次设置此任务时,任务将连接到指定的Excel文件(通过Excel连接),并根据当前电子表格确定每个列的types。
因此,如果您设置Excel源任务,只要确保应该是文本的列仅在列中具有文本。 这意味着Excel Source任务将始终假设任何后续的电子表格将具有相同的格式,并将12345作为文本读取,因为该列在设置任务时是文本。
希望这是有道理的!
我有同样的问题,单列中的多个数据types的值,包只加载数值。 保持所有更新为空。
解
为了解决这个问题,改变excel数据types是解决scheme之一。 在Excel中复制列数据并粘贴到不同的文件中。 删除该列 并将新列插入为文本数据types ,并将复制的数据粘贴到新列中。
现在在ssis包中删除并重新创buildExcel源和目标表,将列数据types更改为varchar 。
这将工作。
如果Excel电子表格中的多个列出现相同的名称,则会发生此类错误。 该包将在使列名不同之后工作。 有时在检查列名时忽略隐藏列。
- 单击function区菜单上的文件,然后单击选项。
-
单击高级,然后在计算此工作簿时,select设置显示精度checkbox,然后单击确定。
-
点击OK。
-
在工作表中,select要格式化的单元格。
-
在主页选项卡上,单击数字旁边的对话框启动器button图像。
-
在类别框中单击数字。
-
在“小数位数”框中,input要显示的小数位数。
这对我有效。 在Excel中select有问题的列 – 突出显示整个列。 将格式更改为“文本”。 保存Excel文件。
在您的SSIS包中,转到“数据stream”窗格进行导入。 双击Excel源节点。 它应该警告你,types已经改变,问你是否要重新映射它们。 单击是。 现在执行应该工作,并带来所有的价值。
注意:我正在使用Excel 2013和Visual Studio 2015,但我认为这些说明也适用于早期版本。