【问题标题】:Bulk Insert with Format File (Fixed Width) - Unexpected end of file was encountered使用格式化文件(固定宽度)批量插入 - 遇到意外的文件结尾
【发布时间】:2016-03-29 17:39:41
【问题描述】:
BULK INSERT [Alldlyinventory] 
   FROM     'C:\Users\Admin\Documents\2NobleEstates\DATA\Download\Output\test.txt' 
   WITH (FORMATFILE = 'C:\SQL Data\FormatFiles\test.xml');

格式化文件:

 <?xml version="1.0"?>
<BCPFORMAT     xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharFixed" LENGTH="8"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="2" xsi:type="CharFixed" LENGTH="7"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="CharFixed" LENGTH="4"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="4" xsi:type="CharFixed" LENGTH="1"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="5" xsi:type="CharFixed" LENGTH="10"     COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="DAY_NUMBER" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="2" NAME="LCBO_NO" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="3" NAME="LOCATION_NUMBER" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="4" NAME="LISTING_STATUS" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="5" NAME="QTY_ON_HAND" xsi:type="SQLNVARCHAR"/>
 </ROW>
</BCPFORMAT>

但我在 SQL Server 2014 上收到以下错误:

消息 4832,第 16 级,状态 1,第 1 行 批量加载:在数据文件中遇到了意外的文件结尾。 消息 7399,第 16 层,状态 1,第 1 行 链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供商没有提供有关该错误的任何信息。 消息 7330,第 16 层,状态 2,第 1 行 无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行。

这是一个固定宽度的导入。

示例文本:

2016032803170570371L 000000014
2016032803367430371L 000000013
2016032803403800371L 000000036
2016032804007540371L 000000015

【问题讨论】:

  • 让我说清楚? 数据文件中第 1 行第 1 列的列太长。请验证是否正确指定了字段终止符和行终止符。
  • 抱歉,这是固定宽度的批量插入
  • 您的 txt 文件末尾可能有空白。您可以使用ERRORFILE 并找到导致问题的行吗?也可以尝试使用ROWTERMINATOR = '0x0A'(虽然没有记录)看看它是否有帮助。
  • 嗨,最后有一个空白。我收到错误:行 1269290 文件偏移量 38078670 错误文件偏移量 0 - HRESULT 0x80004005。请同时查看示例数据。

标签: sql-server tsql bulkinsert bcp


【解决方案1】:

查看您的示例文本文件,您似乎有一个行终止符,即回车符 ({CR}) + 换行符 ({LF})。

您可以通过使用可以显示特殊符号的文本编辑器打开文本文件来检查这一点。我可以推荐Notepad++,它是免费的,非常适合这个目的(菜单View&gt;Show Symbol&gt;Show All Characters)。

如果行终止符确实是{CR}{LF},您应该在&lt;RECORD&gt; 元素中为最后一个&lt;FIELD&gt; 使用xsi:type="CharTerm"TERMINATOR="\r\n" 属性:

<RECORD>
    ...
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>

您可以在以下链接中找到有关固定字段导入的更多信息:XML Format Files (SQL Server) # Importing fixed-length or fixed-width fields

【讨论】:

  • 嗨,数据确实以 {CR}{LF} 结尾,但我收到以下错误:无法为此类型指定属性“ROWTERMINATOR”。之后,我将 ROWTERMINATOR 更改为 TERMINATOR 并且它起作用了。非常感谢。我非常感谢这个论坛和这里的人们。
  • @Ben 是的,你是对的,正确的属性是 TERMINATOR(答案已更新)。很高兴它有帮助 =)。
猜你喜欢
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多