我正在尝试使用SSIS将电子表格导入我们的数据库。出于某种原因,SSIS想要相信其中两列是Double类型,当它们包含字符数据时。我已经尝试将列重新映射为nvarchar(255),但它仍然不想选择它认为是双倍的数据,因为它中有字符。如果我尝试编辑SSIS包并更改Excel源中的列类型,它将不允许我更改错误输出中的列类型,如果常规输出和错误输出列不匹配。
为什么SSIS坚持认为这些列是Double?我怎么能强迫它实现这些字符串呢?为什么微软的所有东西都不能正常工作?
编辑:
我发现了这个:
我对数据进行了排序,以便混合数据类型位于顶部,并猜测:问题已逆转。它不再导入字符数据,而是停止导入纯数字数据。显然有人不认为12345可以表示为字符串......
答案 0 :(得分:41)
我以前见过这个问题,这是Excel的问题而不是SSIS。 Excel会对前几行进行采样,然后即使您明确将其设置为文本也会推断出数据类型。您需要做的是将其放入SSIS包中的Excel文件连接字符串中。该指令告诉Excel列中包含混合数据类型,并提示它在确定列是数字类型之前进行额外检查,而实际上并非如此。
;Extended Properties="IMEX=1"
它应该适用于此(在大多数情况下)。更安全的做法是将Excel数据导出到制表符分隔文本,并使用SSIS导入该文本。
答案 1 :(得分:32)
您可以将列数据转换(即强制)为文本... 试试这个(注意:这些说明基于Excel 2007)......
以下步骤应强制Excel将列视为文本:
使用Excel打开电子表格。
单击列标题,选择包含“主要数字数据”的整个列。
单击功能区菜单上的“数据”选项卡。
选择文本到列。这将打开“将文本转换为列向导”。
- 在步骤1:单击下一步
- 在第2步:点击下一步
- 在步骤3:选择文本,然后单击完成
保存Excel表格。
使用SQL Server 2005导入数据向导重试导入。
此外,这是另一个问题的链接,其中包含其他答案:
Import Data Wizard Does Not Like Data Type I Choose For A Column
答案 2 :(得分:13)
在接受的答案中未提及的一件事是“IMEX = 1”参数必须 in 引用部分:
...;Extended Properties="...";
答案 3 :(得分:7)
; IMEX = 1;并不总是工作... Excel中混合数据类型的一切: Mixed data types in Excel column
答案 4 :(得分:5)
另一种解决方法是使用顶部的字符数据对电子表格进行排序,从而使Excel将列视为字符串,并导入所有内容。
答案 5 :(得分:3)
您还可以更改注册表以查看比前8行更多的值。 我使用过这种方法,效果很好。
答案 6 :(得分:1)
IMEX = 1对我不起作用。 Reynier Booysen的建议也没有。 (我不知道它是否有所作为,但我使用的是SQL Server 2008r2)。一些解决方法的良好解释以及IMEX = 1的原因的一些解释仅限于每个电子表格的前八行,可以在http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75
找到。希望这有帮助
答案 7 :(得分:1)
我使用了以下食谱:
它对我有用......
答案 8 :(得分:1)
我有一段时间用这个问题撞到了墙上。在我们的环境中,我们以各种格式从供应商处获取价格文件,其中一些格式有超过一百万条记录。此问题通常发生在:
问题在于,即使您将外部输入列设置为所需的数据类型,每次运行包时都会扫描文件,并动态更改为OLEDB驱动程序认为该字段应该是的任何内容。
我们的源文件通常包含字段标题(文本)和价格(数字字段),这为我提供了一个简单的解决方案:
第一步:
适用于混合字段:
对于数字字段:
使用OLE DB源的高级编辑器设置输出 价格字段(或任何其他数字字段)到数字的列 数据类型。这会导致包含这些字段中的文本的任何记录 失败,包括标题记录,但强制进行转换 数值保存为文本。
设置错误输出以忽略数字字段上的失败。
或者,如果在重定向的数字字段上仍然需要任何错误,请通过更改SQL WHERE子句来删除标题行,然后排除标题值,
显然,这种方法只适用于有标题字段的地方,但希望这对你们有些人有用。
答案 9 :(得分:0)
选项1.使用Visual Basic迭代每列并将每列格式化为文本。
使用文本到列菜单,不要更改删除,并将“常规”更改为“文本”
答案 10 :(得分:0)
我遇到了同样的问题。问题出在 Excel来源任务中。第一次设置此任务时,任务将连接到指定的Excel文件(通过Excel连接),并根据当前电子表格确定每列的类型。
因此,如果您设置 Excel源任务,只需确保应该是文本的列在列中包含文本。这意味着 Excel来源任务将始终假定任何后续电子表格将具有相同的格式,并将 12345 作为文本读取,因为该列在设置任务时是文本
希望它有意义!
答案 11 :(得分:0)
我有同样的问题,单列中有多个数据类型值,包只加载数值。保持全部更新为null。
<强>解决方案强>
要解决此问题,更改Excel数据类型是解决方案之一。在Excel 复制列数据并粘贴到其他文件中。 删除该列并将新列插入为文本数据类型,并将复制的数据粘贴到新列中。
现在在ssis包中删除并重新创建Excel源和目标表会将列数据类型更改为varchar 。
这样可行。
答案 12 :(得分:0)
如果excel电子表格中的多个列具有相同的名称,则会发生此类错误。在使列名称不同之后,该包将起作用。有时在检查列名时会忽略隐藏列。
答案 13 :(得分:0)
单击“高级”,然后在“计算此工作簿时”下,选中“将精度设置为显示”复选框,然后单击“确定”。
单击“确定”。
在工作表中,选择要格式化的单元格。
在“主页”选项卡上,单击旁边的“对话框启动器”按钮图像 号。
在“类别”框中,单击“数字”。
在小数位数框中,输入小数位数 你想要展示。
答案 14 :(得分:0)
这对我有用。在Excel中选择有问题的列 - 突出显示整列。将格式更改为“文本”。保存Excel文件。
在SSIS包中,转到“数据流”窗格以进行导入。双击“Excel源”节点。它应警告您类型已更改并询问您是否要重新映射它们。单击是。执行现在应该工作并带来所有价值。
注意:我正在使用Excel 2013和Visual Studio 2015,但我认为这些说明也适用于早期版本。
答案 15 :(得分:0)
我花了一些时间才意识到包装中的错误原因。最终,我发现数据被转换为null(Example: from "06" to "NULL"
),并且通过源文件连接(Excel Source> Edit> Connection Manager> Sheet='MySheet'> Preview...
)中的Preview找到了该数据。当我阅读James的帖子以编辑连接字符串以具有扩展属性时,我感到很兴奋:;Extended Properties="IMEX=1"
。但这对我没有用。
我能够通过将Excel工作表中的单元格格式从“数字”更改为“文本”来解决该错误。更改格式后,上传过程成功运行!我的连接字符串如下:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\myServer\d$\Folder1\Folder2\myFile.xlsx;Extended Properties="EXCEL 12.0 XML;HDR=NO";
以下是一些屏幕快照,可以解决我的错误消息。