将平面文件导入 SQL Server - 是否有某种大小/单元格限制?

问题描述 投票:0回答:4

有人可以确认/否认将平面文件导入 SQL Server 时是否存在单元格限制(或任何其他类型的大小限制)吗?

我最近经历了一段令人恼火的时间,导入 csv 文件,它不断返回错误“无法转换为 nvarchar,数据将被截断”...显然该错误消息没有帮助,所以我打开了错误报告,并且注意到它经常在第 300 行和第 330 行之间出错...无论文件如何。

我一定已经放入了 20 个文件并得到了相同的错误,并且始终处于相同的大致相同的行范围。我已经手动检查了每个文件 - 在任何文件的该单元格范围内都没有明显的原因导致该错误消息。

我的文件不大(<1mb), contain mainly nvarchar data, and are limited to 500 rows... they are however quite wide (250 cols), leading me to wonder if there's a cell limit?

我尝试将文件切成两部分,因此每个文件大约有 250 行,而且 - 就像魔术一样 - 它们导入时没有问题。

在我更改生成这些文件的流程之前,有人可以确认我的怀疑是否正确吗? (或者提出其他原因?)

编辑 - 使用 SQL Server 15.0 中内置的“导入平面文件”向导。逗号分隔;双引号;不确定字符串中是否有单引号,因为文本是西班牙语,并且他们不使用撇号!

编辑 2 - 可能最好现在关闭此编辑。很多合乎逻辑的建议反映了我一直在做的故障排除。这至少让人放心,这不是一个明显的疏忽。

sql sql-server import flat-file
4个回答
2
投票

我建议首先将文件加载到暂存区域,这样目标表中现有字段的数据类型/长度就不会出现问题。

导入时,选择数据源后检查每列的“高级”详细信息。 该向导检查表开头的行样本(不记得有多少行)来估计列长度。它默认为 50,因此如果表中的前 x 行少于 50 个字符,它将使用该字符,而没有意识到表中的后续行有更多字符。

这可以解释为什么将其分成两部分可以解决问题...第一部分的行可能全部位于较低的字符范围内(例如低于 50),并且当它处理第二部分时,它确实会在查看时找到较大的行用于估计列宽并进行相应设置的示例。 如果两个大小都小于目标列,则实际 INSERT 不会有问题。

您可以将OutputColumnWidth设置为更合适的数字。


0
投票

有人可以确认/否认将平面文件导入 SQL Server 时是否存在单元格限制(或任何其他类型的大小限制)吗?

您没有达到 SQL Server 中的某种限制。它与您的文件或您用来加载它们的工具有关。


0
投票

Microsoft Excel 的字符数限制为 32,767 个字符,您可以在此处阅读有关此限制的更多信息。

https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3

您可以使用 LEN() 函数查找字符的长度。对于 SQL Server,您可以将数据类型设置为 VARCHAR 并使其最多 8,000 个字符。您可以在这里查看一些规格。

https://www.sqlservertutorial.net/sql-server-basics/sql-server-nvarchar/

我建议您先尝试导入少量数据样本;保存仅包含几十行数据的文件副本。确保它有效,然后使用越来越大的数据集(从 Excel 到 SQL Server)再尝试几次。我认为,无论错误是什么,当您从小数据集转向更大的数据集时,它应该很快就会变得明显。


0
投票

size 与 SSMS v20.1 平面文件导入我的计算机的工作原理的角度来回答这个问题。我没有找到最佳点,但如果你分解文件,它就会起作用。答案可能取决于计算机规格,因此可能没有适合每个人的正确答案。

这有效:

  • 304,104 KB(文件大小)/2,592,754(行)

这不起作用(我在这里不会说英语):

  • 1,210,450 KB(文件大小)/7,197,114(行)

系统信息:

© www.soinside.com 2019 - 2024. All rights reserved.