【问题标题】:Fixed length Bulk Import with BCP format file使用 BCP 格式文件的固定长度批量导入
【发布时间】:2013-12-06 18:43:48
【问题描述】:

我有一个没有列分隔符的巨大的固定长度平面文件,我正在尝试使用 BCP 实用程序将此数据移植到表中。

以下是我使用 BCP 创建的示例格式:

<?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="NCharFixed"   LENGTH="1"/>
  <FIELD ID="2" xsi:type="NCharFixed"  LENGTH="9"/>
  <FIELD ID="3" xsi:type="NCharFixed"   LENGTH="20"/>
  <FIELD ID="4" xsi:type="NCharFixed"   LENGTH="4"/>
  <FIELD ID="5" xsi:type="NCharFixed"  LENGTH="15"/>
  <FIELD ID="6" xsi:type="NCharFixed"   LENGTH="15"/>
  <FIELD ID="7" xsi:type="NCharFixed"   LENGTH="1"/>
  <FIELD ID="8" xsi:type="NCharFixed"  LENGTH="8"/>
  <FIELD ID="9" xsi:type="NCharFixed"  LENGTH="8"/>
  <FIELD ID="10" xsi:type="NCharTerm" TERMINATOR="\r\n" LENGTH="19"/>

 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="BACD"  xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="2" NAME="SSN" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="3" NAME="LASTNAME" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="4" NAME="suffix" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="5" NAME="firstname" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="6" NAME="middlename" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="7" NAME="code" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="8" NAME="dod" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="9" NAME="dob" xsi:type="SQLNCHAR" />
  <COLUMN SOURCE="10" NAME="blank" xsi:type="SQLNCHAR" />

 </ROW>
</BCPFORMAT>

我的餐桌设计: BACD nchar(1), SSN nchar(9), Lastname nchar(20), 后缀 nchar(4), firstname nchar(15), middlename nchar(15), code nchar(1), dod nchar(8), dob nchar (8)、空白 nchar(19)

样本数据: 005070002Foobar FOOOO 1100577505671903

SQL 查询:

BULK INSERT sample.dbo.DD FROM 'C:\sample-for-test.txt'
WITH (FORMATFILE = 'C:\format-n.xml', ROWTERMINATOR='\r\n');
SELECT * FROM sample.dbo.DD;

我得到的错误是: 消息 4863,第 16 级,状态 1,第 1 行 第 1 行第 1 列 (BACD) 的批量加载数据转换错误(截断)。 消息 7399,第 16 层,状态 1,第 1 行 链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供商没有提供有关该错误的任何信息。 消息 7330,第 16 层,状态 2,第 1 行 无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行。

我检查了 BACD 列,长度为 1 个字符,本例中的值为空格。所有列都允许空值。谁能让我知道我做错了什么?为什么会出现这个错误?

【问题讨论】:

  • 通过使用SELECT TOP 1000 * FROM OPENROWSET(BULK 'C:\sample-for-test.txt', FORMATFILE 'C:\format-n.xml') t 进行测试,将 sample.dbo.DD 排除在外
  • 嗨@anon,它与该查询相同的错误。
  • 尝试使用 FIRSTROW = 2 看看它是否只是第一行。此外,请尝试使用不同的 CODEPAGE 选项。 technet.microsoft.com/en-us/library/ms190312.aspx
  • @anon 谢谢你,我至少到了某个地方。我将查询更改为: SELECT top 10 * FROM OPENROWSET (BULK 'C:\sample-for-test.txt', FORMATFILE = 'C:\format-n.xml', FIRSTROW = 2, LASTROW=20) t;现在我收到以下错误“批量加载失败。数据文件中第 1 行第 13 列的列太长。验证是否正确指定了字段终止符和行终止符。”

标签: sql sql-server bcp


【解决方案1】:

我已经很多年没有看过 SQL Server 的东西了,但我下意识的回答是你需要在目标表中定义一个主键。如果您有一个,那么您的 BACD 列中的非唯一项可能违反了现有的索引规则。

让我知道这是否有帮助。

【讨论】:

    【解决方案2】:

    它工作得很好......将 NCharFixed 更改为 CharFixed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多