【问题标题】:SSIS Excel Import Forcing Incorrect Column TypeSSIS Excel导入强制不正确的列类型
【发布时间】:2010-10-07 05:59:03
【问题描述】:

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

为什么 SSIS 坚持这些列是 Double?我怎样才能强迫它意识到这些是字符串?为什么微软的一切都不能完全正常工作?

编辑:

我发现了这个:

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

【问题讨论】:

标签: sql-server excel types ssis


【解决方案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】:
      1. 单击功能区菜单上的文件,然后单击选项。
      2. 单击高级,然后在计算此工作簿时,选中将精度设置为显示复选框,然后单击确定。

      3. 点击确定。

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

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

      6. 在“类别”框中,单击“编号”。

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

      【讨论】:

        【解决方案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】:

              我使用了以下配方:

              1. 将数据从 Excel 导入 Access
              2. 将数据从 Access 导入 SQL Server

              它对我有用...

              【讨论】:

              • 您能解释一下这如何帮助维护正确的类型吗?从表面上看,您的回答似乎没有回答问题。
              【解决方案8】:

              我以前见过这个问题,不是 SSIS 是 Excel 的问题。 Excel 对第一几行进行采样,然后推断数据类型,即使您将其显式设置为文本也是如此。您需要做的就是将它放入 SSIS 包中的 Excel 文件连接字符串中。该指令告诉 Excel 列包含混合数据类型,并提示它在确定列是数字类型之前进行额外检查,而实际上它不是。

              ;Extended Properties="IMEX=1"
              

              它应该适用于此(在大多数情况下)。更安全的做法是将 Excel 数据导出为制表符分隔的文本,然后使用 SSIS 导入。

              【讨论】:

              • 我只能通过保存 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="...";
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-01-11
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多