0

我有一个 18GB 的​​平面文件(40,000,000 条记录),具有固定的列宽(无字段终止符),我想将其读入 SQL Server 2008 R2 表。除了包含数据的文本文件之外,我还获得了一个包含字段名称和长度的 Excel 文档。有 270 个字段,每条记录(每行)总共 465 个字符。使用 bcp 我创建了一个 fmt 文件,对我来说看起来不错。

10.0

270

1   SQLCHAR  2  1  ""  1  TitleCode   SQL_Latin1_General_CP1_CI_AS

2   SQLCHAR  2 12  ""  2  FamilyID    SQL_Latin1_General_CP1_CI_AS

3   SQLCHAR  2 12  ""  3  LocationID  SQL_Latin1_General_CP1_CI_AS

等等

在 SQL Server 中,我想使用这个 fmt 文件将数据读入表中:

BULK INSERT dbo.Customer2_noId

    FROM 'C:\Uploads\dataFile_MICX\dataFile_MICX_Copy.txt'

    WITH (FORMATFILE = 'C:\Users\kriss\SqlScripts\Customer2_noId-n.fmt');

GO

来自 SQL Server 的错误消息:

消息 4866,第 16 级,状态 7,第 1 行

批量加载失败。数据文件中第 1 行第 1 列的列太长。请验证是否正确指定了字段终止符和行终止符。

消息 7399,第 16 层,状态 1,第 1 行

链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供商没有提供有关该错误的任何信息。

消息 7330,第 16 层,状态 2,第 1 行

无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行。

我尝试将最后一个字段的归档终止符更改为“\r”和“\r\n”我尝试在底部添加一个额外的字段:

271   SQLCHAR  0 0  "\r\n"  271  dummy SQL_Latin1_General_CP1_CI_AS

没什么区别。

我一直无法在网上找到任何有帮助的东西。(建议在 fmt 文件中使用额外的空白行,但这并不能解决问题。我认为数据文件有行终止符,因为如果我使用 Excel 数据导入工具,我会看到一致长度的行。

有人可以帮忙吗?谢谢,克里斯

4

1 回答 1

0

没有动手,我只能提供一些想法和建议:

首先,您需要确定是否存在行终止符——文件中可能没有 /r /n、char(13)+char(10)、空终止符或其他任何内容。

尝试获取该文件的副本,该副本仅包含前 10、100 行,可能还有 1000 行可供使用。(创建它可以更容易地找到行终止符的存在或不存在)。那里有很多这样的编辑器。我过去使用过 LTFViewr,不知道他们现在是什么版本。

我记得 BCP 对它的行和列分隔符非常挑剔。如果某件事不匹配,它就会失败。(我记得必须调整文件中奇怪的第一行或最后一行才能使 BCP 工作。)

您是否考虑过使用集成服务 (SSIS)?尽管它确实代表了明显不同的学习曲线,但它更加灵活和适应性强。它的一大优势是微软在 2005 版本中对其进行了改进,我怀疑他们在过去六年中甚至对 BCP 进行了代码审查。

于 2010-09-27T22:11:35.820 回答