SSIS Excel导入强制不正确的列类型

时间:2009-02-12 17:44:31

标签: sql-server excel types ssis

我正在尝试使用SSIS将电子表格导入我们的数据库。出于某种原因,SSIS想要相信其中两列是Double类型,当它们包含字符数据时。我已经尝试将列重新映射为nvarchar(255),但它仍然不想选择它认为是双倍的数据,因为它中有字符。如果我尝试编辑SSIS包并更改Excel源中的列类型,它将不允许我更改错误输出中的列类型,如果常规输出和错误输出列不匹配。

为什么SSIS坚持认为这些列是Double?我怎么能强迫它实现这些字符串呢?为什么微软的所有东西都不能正常工作?

编辑:

我发现了这个:

我对数据进行了排序,以便混合数据类型位于顶部,并猜测:问题已逆转。它不再导入字符数据,而是停止导入纯数字数据。显然有人不认为12345可以表示为字符串......

16 个答案:

答案 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

enter image description here

答案 4 :(得分:5)

另一种解决方法是使用顶部的字符数据对电子表格进行排序,从而使Excel将列视为字符串,并导入所有内容。

答案 5 :(得分:3)

您还可以更改注册表以查看比前8行更多的值。 我使用过这种方法,效果很好。

http://support.microsoft.com/kb/281517

答案 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)

我使用了以下食谱:

  1. 将数据从Excel导入到Access
  2. 从Access导入数据到SQL Server
  3. 它对我有用......

答案 8 :(得分:1)

我有一段时间用这个问题撞到了墙上。在我们的环境中,我们以各种格式从供应商处获取价格文件,其中一些格式有超过一百万条记录。此问题通常发生在:

  • OLEDB驱动程序扫描的行似乎包含数字,但稍后在记录集中包含混合值,或
  • 字段只包含数字,但源的格式为文本(通常是Excel文件)。

问题在于,即使您将外部输入列设置为所需的数据类型,每次运行包时都会扫描文件,并动态更改为OLEDB驱动程序认为该字段应该是的任何内容。

我们的源文件通常包含字段标题(文本)和价格(数字字段),这为我提供了一个简单的解决方案:

第一步:

  • 更改SQL语句以包含标题字段。这种力量 SSIS将所有字段视为文本,包括价格字段。

适用于混合字段:

  • 您的初始问题已解决,因为您的字段现在是文本,但您的输出中仍有一个标题行。
  • 通过更改SQL WHERE子句以排除标头值,防止标题行进入输出"在哪里([F4] ='价格')"

对于数字字段:

  • 使用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)

  1. 单击功能区菜单上的“文件”,然后单击“选项”。
  2. 单击“高级”,然后在“计算此工作簿时”下,选中“将精度设置为显示”复选框,然后单击“确定”。

  3. 单击“确定”。

  4. 在工作表中,选择要格式化的单元格。

  5. 在“主页”选项卡上,单击旁边的“对话框启动器”按钮图像 号。

  6. 在“类别”框中,单击“数字”。

  7. 在小数位数框中,输入小数位数 你想要展示。

答案 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";

以下是一些屏幕快照,可以解决我的错误消息。

错误 Excel文件连接的元数据 enter image description here

错误来源“常规”格式 enter image description here

错误源已更改“文本”格式 enter image description here

已修复错误 Excel文件连接的元数据 enter image description here