【发布时间】: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