bulk insert异常:大容量加载失败。数据文件中第 1 行的第 2 列太长。请验证是否正确指定了字段终止符和行终止符

bulk insert错误:大容量加载失败。数据文件中第 1 行的第 2 列太长。请验证是否正确指定了字段终止符和行终止符。
本帖最后由 YanMang 于 2014-11-03 14:29:17 编辑
同样一套别人写的ASP程序,从原来的服务器,迁移到新服务器之后,就报错了。
度娘和谷姐问了N天也没问出个道道,做了N多尝试还是不行。

ASP程序中是这样写的:
<%
set mblConn = Server.CreateObject("Adodb.Connection")
'连接字符串
mblConn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=1231wrwer234;Initial Catalog=TempDB;Data Source=(local)"
'原来是如下方式写的,没问题的,下面第二行是我百度之后写的
'Sql = "BULK INSERT sms FROM '" & mblsav & "' WITH (FIELDTERMINATOR = ',',BATCHSIZE = 100000)"
Sql = "BULK INSERT sms FROM '" & Server.MapPath("data1.sms") & "' WITH (FIELDTERMINATOR = ',',formatfile = '"&server.MapPath("smsFormat.xml")&"',ROWTERMINATOR = '\r\n',BATCHSIZE = 100000)"
'上面的FormatFile  我不管是用“smsFormat.xml”还是“sms.fmt”都不行,应该不关这个事。
response.Write(Sql)
mblConn.Execute(Sql)
mblConn.Close
set mblConn = Nothing
%>


要插入的数据文件“data1.sms”中是这样的:
NULL,13853923598,20544,0,20544,1,2013-06-01 10:25:17
NULL,13791515940,20544,0,20544,1,2013-06-01 10:25:17
NULL,13645396665,20544,0,20544,1,2013-06-01 10:25:17
NULL,15910169287,20544,0,20544,1,2013-06-01 10:28:56
NULL,18653990855,20544,0,20544,2,2013-06-01 10:28:59
NULL,13869939487,20544,0,20544,1,2013-06-01 10:28:59


formatfile的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="NativeFixed" LENGTH="4"/>
  <FIELD ID="2" xsi:type="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="11" COLLATION="Chinese_PRC_CI_AS"/>
  <FIELD ID="3" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
  <FIELD ID="4" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
  <FIELD ID="5" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
  <FIELD ID="6" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
  <FIELD ID="7" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="m_id" xsi:type="SQLINT"/>
  <COLUMN SOURCE="2" NAME="m_num" xsi:type="SQLCHAR"/>
  <COLUMN SOURCE="3" NAME="m_usr" xsi:type="SQLINT"/>
  <COLUMN SOURCE="4" NAME="m_die" xsi:type="SQLSMALLINT"/>
  <COLUMN SOURCE="5" NAME="m_sid" xsi:type="SQLINT"/>
  <COLUMN SOURCE="6" NAME="m_tpe" xsi:type="SQLSMALLINT"/>
  <COLUMN SOURCE="7" NAME="m_dat" xsi:type="SQLDATETIME"/>
 </ROW>
</BCPFORMAT>


表结构如下:
bulk insert异常:大容量加载失败。数据文件中第 1 行的第 2 列太长。请验证是否正确指定了字段终止符和行终止符
create table sms
(
m_id int identity(1,1),
m_num char(11),
m_usr int,
m_die smallint,
m_sid int,
m_tpe smallint,
m_dat datetime
)
alter table sms add
constraint PK_sms_m_id primary key(m_id)
go


一执行就报错:
bulk insert异常:大容量加载失败。数据文件中第 1 行的第 2 列太长。请验证是否正确指定了字段终止符和行终止符

请求大神们指点啊,在线等!感谢万分!

以上需要用到的文件下载链接:
http://go.zhangshangly.com/bulkinsert.zip
------解决思路----------------------
检查数据库表的栏位长度不兼容,提示:数据超过表的列的长度
------解决思路----------------------
用你的数据测了一下,是文件里有null造成的,删除NULL就行了

xml在sql08环境生成的格式

<?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="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="11" COLLATION="Chinese_PRC_CI_AS"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="7"/>
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="7"/>
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="24"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="m_id" xsi:type="SQLINT"/>
  <COLUMN SOURCE="2" NAME="m_num" xsi:type="SQLCHAR"/>
  <COLUMN SOURCE="3" NAME="m_usr" xsi:type="SQLINT"/>
  <COLUMN SOURCE="4" NAME="m_die" xsi:type="SQLSMALLINT"/>
  <COLUMN SOURCE="5" NAME="m_sid" xsi:type="SQLINT"/>
  <COLUMN SOURCE="6" NAME="m_tpe" xsi:type="SQLSMALLINT"/>
  <COLUMN SOURCE="7" NAME="m_dat" xsi:type="SQLDATETIME"/>
 </ROW>
</BCPFORMAT>

直接查看语句

SELECT *
      FROM  OPENROWSET(BULK  'C:\文件夹路径\data2.sms',
      FORMATFILE='C:\文件夹路径t\smsFormat.Xml'     
      ) as t1 ;
------解决思路----------------------
数据库中是自增字段,导入不应该省略  <COLUMN SOURCE="1" NAME="m_id" xsi:type="SQLINT"/> 吗?
------解决思路----------------------
可过滤可以这样用

INSERT INTO sms
   with (KEEPIDENTITY)
   (m_num
        ,m_usr
        ,m_die
        ,m_sid
        ,m_tpe
        ,m_dat)
 SELECT m_num
        ,m_usr
        ,m_die
        ,m_sid
        ,m_tpe
        ,m_dat
      FROM  OPENROWSET(BULK  'C:\文件夹路径\bulkinsert\data1.sms',
      FORMATFILE='C:文件夹路径\smsFormat.Xml'     
      ) as t1 ;

也可以改xml格式文件控制
------解决思路----------------------
 <ROW>
  <COLUMN SOURCE="1" NAME="m_id" xsi:type="SQLCHAR"/>

把这里改改,XML格式文件,改为字符串,也是可以的