从 Excel 到 SQL Server 的数据导入无法导入所有数据

Posted

技术标签:

【中文标题】从 Excel 到 SQL Server 的数据导入无法导入所有数据【英文标题】:Data import from Excel to SQL Server failing to import all data 【发布时间】:2013-03-30 21:06:11 【问题描述】:

在使用导入和导出数据工具将数据从 Excel 导入 SQL Server 时发生了一件奇怪的事情。

不足之处是我可以在Excel中看到数据,但所有数据都没有导入。

我有一个包含一个电子表格的 Excel 工作簿。我可以看到列中的数据,一切看起来都很好。当我使用导入向导导入数据时,我可以看到列和预览数据,但是在执行导入时数据并没有全部传输过来。没有错误,导入过程完成——它只是将一堆空值插入到表中。

这似乎最常发生在数字上——假设我有三列分别表示名字、姓氏和 ID 号。我会得到所有的名字和姓氏,以及一些身份证号码。我找不到正在发生的事情的模式。

我以前发生过一次这种情况,我注意到在导入过程中有两个电子表格可供选择:DataImport 和 DataImport$ - 第一个会如上所述失败,而第二个会完美导入。这次只有一个电子表格可供选择。

我主要是在 64 位系统上使用 XLS 文档和 32 位导入向导,但我愿意尝试任何事情。

关于为什么有两个电子表格(有时)以及为什么这个导入会失败的任何想法?

戴夫

【问题讨论】:

您可以尝试复制确切的数据范围然后创建一个新的excel文件,但是在粘贴数据之前,您可以将新创建​​的excel文件的单元格格式设置为文本并尝试导入这个新文件。 我尝试将所有格式更改为一般文本,但没有帮助。我确实注意到一些数字字段有一个小三角形,表示相邻的单元格是数字,这是文本,所以我尝试将列格式更改为一种或另一种。不过,结果没有任何变化。我从未尝试将数据复制并粘贴到新的电子表格中,但我可以尝试一下。几分钟后我会告诉你情况如何。 不走运。复制和粘贴技巧不起作用。我注意到失败的列有三个正确的行,然后是一个应该是空白的行(对于那个 ID 列),然后什么都没有被导入(对于那个 ID 列)。另外,如果这很重要,我正在使用 Excel 2013。 如果不是2003,能否将其保存为2003文件再试一次。此外,在导入时,您是否可以检查列属性。 ID 列可以设置为非空。如果是这样,它将停止。 我一直使用 Excel 2003 文件格式 (XLS) 而不是 XLSX 文件,因为我发现它们更可靠。对于“非空”问题 - 这将在数据库架构中而不是 Excel 文件中,对吗?在这种情况下,我预计会引发错误并且不会导入更多行,但没有错误,会导入更多行,但该 ID 列中没有任何值。 【参考方案1】:

我正在将数据上传到现有表。我所做的是编写现有表的脚本以验证我正在导入的列是否与现有列匹配。原来我的一列不匹配,它只是部分导入数据集。

【讨论】:

【参考方案2】:

似乎来自 SSMS 的导入工具会抽取前“x”行的样本来确定列的数据类型和它的其他特征,所以如果它选择是 double 它将把文本值作为 null 和如果它以文本形式读取,则不会显示任何数字。 如果您有 Microsoft Access,您可以先使用访问导入,它允许您选择自己的列类型并将其保存为访问文件,然后导入对 SQL 服务器的访问并“瞧”,它可以工作(至少对我来说),我希望它可以帮助别人。

【讨论】:

【参考方案3】:

最后将单元格格式化为一般对我有用的地方有数值,早些时候它显示 %s 但现在它已解决。

【讨论】:

【参考方案4】:

我遇到了完全相同的问题使用 .xlsx 文件解决了我的问题。

【讨论】:

【参考方案5】:

我能够通过对数据进行排序以使文本数据位于顶部来解决问题。这样 SQL Server 就知道它是文本数据,而不是数字数据。

【讨论】:

【参考方案6】:

我也有这个问题。我能够解决它的唯一方法是将 .xlsx 文件保存为 .csv 文件,然后将 .csv 文件使用到 SQL Server“导入数据”中。

Microsoft Excel 和 Microsoft SQL Server 之间的集成似乎会更干净。

我的版本是: Excel 2013。 SQL Server 2012。

【讨论】:

我不能使用 CSV,但将 XLSX 保存为 XLS 并使用 32-but 导入程序似乎给了我一些可靠的结果。【参考方案7】:

选择该列的所有行并将类型更改为 Excel 中的文本,然后选择整个列并将类型更改为文本肯定会起作用。

【讨论】:

【参考方案8】:

我的问题是我正在导入的文件是一个较旧且有些恶意的 excel 文件。我打开文件并将其另存为 .xlsx,然后文件成功导入,之后没有空数据。

【讨论】:

【参考方案9】:

您的问题的答案可能涉及数据如何存储在 Excel 中。

我刚刚遇到了同样的问题。我有一列包含两种类型的值:数字和带有破折号的数字。 (例如 51000 和 2009-00949)我需要将它们作为 NVARCHAR 或 VARCHAR 导入,但是 SQL 导入向导 (SQL2005) 只会导入数字而不是带有破折号的数字或带有破折号的数字而不是数字,取决于第一条记录中的类型。未导入的值将在字段中具有“空”值,从而使我的记录无用。

我尝试使用 Excel 中的格式|单元格菜单选项(数字、文本、常规等)和 SQL 中的各种映射选项(nvar、nvarchar、varchar、sqlvariant、float),但没有成功。

解决方案是使用 Excel 中的数据|文本到列选项,而不是单元格格式选项将数值存储为文本。当我在列上使用它时,数值(例如 51000)转换为存储为文本值的数字(左上角出现小绿色三角形错误),带有破折号的数字仍保留为文本。我必须以这种格式保留数据,并带有绿色小三角形错误,否则将无法成功导入 SQL。当列中的数据以这种格式存储时,两种类型的列数据(数字和带破折号的数字)与其他记录数据一起正确导入,列中没有空值。

【讨论】:

我这周又在处理这个问题,所以你的回复很及时。我注意到,格式化电子表格确实有帮助,但它并非万无一失。我遇到过一些情况,其中按照您描述的方式格式化数据会有所帮助,而在一些情况下则没有。而且我找不到它背后的韵律或原因。 +100!杰出的。我一直在断断续续地与此作斗争,解决方案非常简单。我希望我能考虑一下。谢谢! 谢谢!这让我发疯了,Data|Text To Columns 就是解决方案! Data > Text To Columns 对我有用,这是我的确切情况。谢谢。 只想添加这在 2021 年仍然与现代版本的 Excel/O365、SQL Server 2019 和 SSMS 18.10 相关。【参考方案10】:

很可能是那个所谓的空白行导致 Sql Server 忽略其余数据。 Bu确定你能分享excel文件的模式和前五行吗?正确的三个和接下来的两个记录。

【讨论】:

很遗憾,我无法共享此电子表格 - 因为我的理论是手动编辑电子表格会污染数据,所以我不知道编辑和上传它是否有价值。不过,如果您认为这会有所帮助,我可以试一试。 您可以尝试将 excel 文件另存为 csv 并将其导入为 csv 文件吗?它可能会让我们更深入地了解导致此问题的原因。 我将文件导出为制表符分隔的文件,然后重新导入它并且它工作。从长远来看,这个解决方案最终会奏效,但我很想知道 Excel 失败的原因。 我很高兴它成功了。从长远来看,我完全同意你的看法。这真的很有趣。【参考方案11】:

您正在使用导入向导,不是吗?在向导的“选择源表和视图”页面上单击Edit Mappings,并检查每个源列的 Type、Nullable 和 Size 列。听起来有些东西没有正确映射。

【讨论】:

是的,我正在使用向导。每次我手动检查(或在某些情况下创建)映射时,我很确定它们是正确的。多年来我一直使用 excel 传输数百万行,但我有一个客户端提供的导入文件并不总是有效,所以我不知所措。

以上是关于从 Excel 到 SQL Server 的数据导入无法导入所有数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel 到 SQL Server 的数据导入无法导入所有数据

如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?

Kettle从excel导入数据到sql server

将数据从 MS Sql Server 存储过程导出到 excel 文件

将数据从SQL Server导出到Microsoft Excel数据表

如何将数据从Excel电子表格导出到Sql Server 2008表