SSIS Excel导入强制不正确的列类型
Posted
技术标签:
【中文标题】SSIS Excel导入强制不正确的列类型【英文标题】:SSIS Excel Import Forcing Incorrect Column Type 【发布时间】:2010-10-07 05:59:03 【问题描述】:我正在尝试使用 SSIS 将电子表格导入我们的数据库。出于某种原因,SSIS 想要相信其中两列是 Double 类型,当它们包含字符数据时。我尝试将列重新映射为 nvarchar(255) 但它仍然不想选择它认为是双倍的数据,因为其中有字符。如果我尝试编辑 SSIS 包并更改 Excel 源中的列类型,它不会让我更改错误输出中列的类型,如果常规输出和错误输出列没有,则会给我一个错误匹配。
为什么 SSIS 坚持这些列是 Double?我怎样才能强迫它意识到这些是字符串?为什么微软的一切都不能完全正常工作?
编辑:
我发现了这个:
PRB: DTS Wizard may not detect Excel column type for mixed data in SQL Server我对我的数据进行了排序,以便混合数据类型位于顶部,你猜怎么着:问题反转。它不再导入字符数据,而是停止导入纯数字数据。显然有人不认为 12345 可以表示为字符串...
【问题讨论】:
与此帖类似:***.com/questions/779754/…. 现在您知道我为什么要求人们提供 .csv 文件而不是 Excel 文件进行导入了。如果我能提供帮助,我从不接受 Execl 文件。说真的,如果您有任何方法要求提供商以体面的格式向您提供文件,我会这样做,而不是花时间尝试解决这样的问题。 SSIS Excel Data Source - Is it possible to override column data types?的可能重复 【参考方案1】:我花了一点时间才意识到我的包中的错误来源。最终我发现数据被转换为空(Example: from "06" to "NULL"
),我通过源文件连接中的预览(Excel Source> Edit> Connection Manager> Sheet='MySheet'> 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文件连接元数据
错误来源:“一般”格式
错误来源已更改:“文本”格式
错误已修复:Excel 文件连接元数据
【讨论】:
【参考方案2】:这对我有用。在 Excel 中选择有问题的列 - 突出显示整列。将格式更改为“文本”。保存 Excel 文件。
在您的 SSIS 包中,转到“数据流”窗格进行导入。双击 Excel 源节点。它应该警告您类型已更改,并询问您是否要重新映射它们。单击是。执行现在应该可以工作并引入所有值。
注意:我使用的是 Excel 2013 和 Visual Studio 2015,但我认为这些说明也适用于早期版本。
【讨论】:
【参考方案3】:-
单击功能区菜单上的文件,然后单击选项。
单击高级,然后在计算此工作簿时,选中将精度设置为显示复选框,然后单击确定。
点击确定。
在工作表中,选择要设置格式的单元格。
在主页选项卡上,单击旁边的对话框启动器按钮图像 编号。
在“类别”框中,单击“编号”。
在小数位数框中,输入小数位数 你想显示。
【讨论】:
【参考方案4】:如果 excel 电子表格中的多个列具有相同的名称,则会发生这种错误。使列名不同后,该包将起作用。有时在检查列名称时会忽略隐藏列。
【讨论】:
【参考方案5】:有一段时间我一直在为这个问题撞墙。在我们的环境中,我们使用来自供应商的各种格式的价格文件,其中一些具有超过一百万条记录。此问题通常发生在:
OLEDB 驱动程序扫描的行似乎包含数字,但稍后在记录集中确实包含混合值,或者 字段确实只包含数字,但源有一些格式为文本(通常是 Excel 文件)。问题在于,即使您将外部输入列设置为所需的数据类型,每次运行包时都会扫描该文件,并动态更改为 OLEDB 驱动程序认为该字段应为的任何值。
我们的源文件通常包含字段标题(文本)和价格(数字字段),这给了我一个简单的解决方案:
第一步:
更改您的 SQL 语句以包含标题字段。这迫使 SSIS 以文本形式查看所有字段,包括价格字段。对于混合领域:
您的初始问题已解决,因为您的字段现在是文本,但您的输出中仍有标题行。 通过更改 SQL WHERE 子句以排除标题值来防止标题行进入您的输出,例如"WHERE NOT([F4]='Price')"对于数字字段:
使用 OLE DB 源的高级编辑器,设置输出 价格字段(或任何其他数字字段)的列转换为数字 数据类型。这会导致在这些字段中包含文本的任何记录 失败,包括标题记录,但强制转换 数值保存为文本。
设置错误输出以忽略数字字段上的错误。
或者,如果您仍然需要重定向数字字段的任何错误,请通过更改 SQL WHERE 子句以排除标题值来删除标题行,然后,
设置错误输出以重定向此字段上的失败。显然,此方法仅适用于您有标题字段的情况,但希望这对你们中的一些人有所帮助。
【讨论】:
【参考方案6】:我遇到了同样的问题,单列中有多个数据类型值,包仅加载数值。保持所有更新为空。
解决方案
要解决此问题,更改 excel 数据类型是解决方案之一。在 Excel 中复制列数据并粘贴到不同的文件中。 删除该列并将新列插入为文本数据类型,然后将复制的数据粘贴到新列中。
现在在 ssis 包中删除并重新创建 Excel 源和目标表将列数据类型更改为 varchar。
这会起作用。
【讨论】:
【参考方案7】:我使用了以下配方:
-
将数据从 Excel 导入 Access
将数据从 Access 导入 SQL Server
它对我有用...
【讨论】:
您能解释一下这如何帮助维护正确的类型吗?从表面上看,您的回答似乎没有回答问题。【参考方案8】:我以前见过这个问题,不是 SSIS 是 Excel 的问题。 Excel 对第一几行进行采样,然后推断数据类型,即使您将其显式设置为文本也是如此。您需要做的就是将它放入 SSIS 包中的 Excel 文件连接字符串中。该指令告诉 Excel 列包含混合数据类型,并提示它在确定列是数字类型之前进行额外检查,而实际上它不是。
;Extended Properties="IMEX=1"
它应该适用于此(在大多数情况下)。更安全的做法是将 Excel 数据导出为制表符分隔的文本,然后使用 SSIS 导入。
http://blogs.acceleration.net/ryan/archive/2005/01/11/477.aspx【讨论】:
我只能通过保存 SSIS 包并进入 Visual Studio 来编辑连接字符串,这很有效,但我在尝试运行包时不断出错。最后导出到制表符分隔......这比它应该做的要难。 :( 如果您使用包配置文件,您可以在运行时加载全新的连接字符串,包括 IMEX 连接字符串属性。此外,shedule 任务或执行包对话框还允许您覆盖任何连接字符串。 我无法弄清楚如何在 SQL Server Management Studio 中执行此操作。我真的不知道这个字符串会去哪里。有人知道吗? +1 将 Excel 文档导出为制表符分隔并作为平面文件导入 SQL。只要确保您进入高级并确保列类型和长度是您想要的。【参考方案9】:您可以将列数据转换(即强制)为文本... 试试这个(注意:这些说明基于 Excel 2007)...
以下步骤应强制 Excel 将列视为文本:
使用 Excel 打开您的电子表格。
通过单击列标题选择包含“主要是数字数据”的整个列。
单击功能区菜单上的“数据”选项卡。
选择文本到列。这将打开将文本转换为列向导。
-在第 1 步:点击下一步
-在第2步:点击下一步
-在第三步:选择文本并点击完成
保存您的 Excel 工作表。
使用 SQL Server 2005 导入数据向导重试导入。
另外,这里是另一个问题的链接,该问题有其他答案:
Import Data Wizard Does Not Like Data Type I Choose For A Column
【讨论】:
有史以来最好的、严肃的解决方案。对我来说效果很好,导入到 SQL 2014。问题是一些邮政编码被格式化为 99999,另一些为 99999-9999,还有一些是加拿大或英国格式!这种方法处理得很好。注意:需要一次完成 1 列,例如邮编、电话、传真都是分开的。 天哪,这确实有效。我尝试仅复制粘贴值,创建新工作表,第一列虚拟文本。没有任何效果。 这应该是答案,因为我在将 excel 直接导入 sql server(不使用 SSIS)时遇到了同样的问题,它为我解决了这个问题。【参考方案10】:;IMEX=1;并不总是有效...关于 Excel 中混合数据类型的一切: Mixed data types in Excel column
【讨论】:
【参考方案11】:IMEX=1 对我不起作用。 Reynier Booysen 的建议也没有。 (我不知道它是否有区别,但我使用的是 SQL Server 2008r2)。可以在http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75
找到一些解决方法的很好解释以及为什么 IMEX=1 仅限于每个电子表格的前八行的一些解释希望对你有帮助
【讨论】:
【参考方案12】:我遇到了同样的问题。 Excel Source 任务中存在问题。当您第一次设置此任务时,该任务将连接到指定的 Excel 文件(通过 Excel 连接)并根据当前电子表格决定每列的类型。
因此,如果您设置 Excel Source 任务,只需确保应该是文本的列中只有文本。这意味着 Excel Source 任务将始终假定任何后续电子表格将具有相同的格式并将 12345 读取为文本,因为在设置任务时该列是文本.
希望它有意义!
【讨论】:
【参考方案13】:您还可以更改注册表以查看比前 8 行更多的值。 这个方法我用过,效果很好。
http://support.microsoft.com/kb/281517
【讨论】:
【参考方案14】:另一种解决方法是使用顶部的字符数据对电子表格进行排序,从而导致 Excel 将列视为字符串,并以此类方式导入所有内容。
【讨论】:
【参考方案15】:选项 1. 使用 Visual Basic 遍历每一列并将每一列格式化为文本。
使用Text-to-Columns菜单,不改变分隔线,将“General”改为“Text”
【讨论】:
【参考方案16】:接受的答案中未提及的一件事是“IMEX=1”参数必须在以下的引用部分:
...;Extended Properties="...";
【讨论】:
以上是关于SSIS Excel导入强制不正确的列类型的主要内容,如果未能解决你的问题,请参考以下文章
SSIS 2008,Excel 2007 正确格式化 excel 列(导出,不导入)