无法将大型平面文件导入SQL Server 2008表

时间:2010-09-27 21:47:10

标签: sql-server bulkinsert bcp

我有一个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的错误消息:

  

Msg 4866,Level 16,State 7,Line 1

     

批量加载失败。专栏是   第1行的数据文件中的时间太长,   第1列。验证该字段   终结符和行终止符是   指定正确。

     

Msg 7399,Level 16,State 1,Line 1

     

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

     

Msg 7330,Level 16,State 2,Line 1

     

无法从OLE DB中获取行   提供商“BULK”用于链接服务器   “(空)”。

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

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

没有任何区别。

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

有人可以帮忙吗? 谢谢,Kriss

1 个答案:

答案 0 :(得分:0)

如果没有亲身实践的工作,我只能提供一些想法和建议:

首先,您需要确定是否存在行终止符 - 可能没有/ r / n,char(13)+ char(10),null-terminator或文件中的任何内容。< / p>

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

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

您是否考虑过使用整合服务(SSIS)?虽然它确实代表了一个截然不同的学习曲线,但它更灵活,更具适应性。它有一个很大的优势,就是微软在2005版本上已经对它进行了改进,我怀疑他们在过去的六年中甚至对BCP进行了代码审查。