批量插入使用格式文件,用于数据文件和实际数据库表之间的不同列数

时间:2013-09-23 11:40:21

标签: sql sql-server tsql bulkinsert bcp

这是表的模式

Create table dbo.Project
(
ProjectID (int,not null)
ManagerID (int,not null)
CompanyID(int, not null)
Title (nvarchar(50),not null)
StartDate(datetime,not null)
EndDate(datetime,null)
ProjDescription(nvarchar(max))
)

我从这个表创建了一个名为bob.dat的数据文件,它有大约15行,带有以下bcp命令

bcp "Select ProjectID,ManagerID,CompanyID,Title,StartDate from CATS.dbo.Project" queryout "C:\Documents\bob.dat" -Sbob-pc -T -n 

还使用以下bcp命令

创建了名为bob.fmt的格式/映射文件
bcp CATS.dbo.Project format nul -f C:\Documents\bob.fmt -x -Sbob-pc -T -n 

然后我创建了一个表项目的副本。

Create table dbo.ProjectCopy
(
ProjectID (int,not null)
ManagerID (int,not null)
CompanyID(int, not null)
Title (nvarchar(50),not null)
StartDate(datetime,not null)
EndDate(datetime,null)
ProjDescription(nvarchar(max))

我现在要做的是使用bob.dat和bob.format文件使用以下Bulk Insert语句填充此表ProjectCopy。

BULK INSERT CATS.dbo.ProjectCopy
 FROM 'C:\Documents\bob.dat' 
WITH (FORMATFILE = 'C:\Documents\bob.fmt',
 LASTROW=5,
 KEEPNULLS,
  DATAFILETYPE='native');
  GO
 SELECT * FROM CATS.dbo.ProjectCopy
 GO

所以基本上数据文件不包含EndDate和ProjDescription列的任何数据。我希望这两列保持为null。不幸的是我得到了 运行批量插入语句时出现以下错误。

 Msg 4863, Level 16, State 4, Line 2
 Bulk load data conversion error (truncation) for row 1, column 6 (EndDate).
 Msg 7399, Level 16, State 1, Line 2
 The OLE DB provider "BULK" for linked server "(null)" reported an error. 
 The provider did not give any information about the error.
 Msg 7330, Level 16, State 2, Line 2
 Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

 (0 row(s) affected)

任何人都知道如何解决这个问题? 只是为了通知你所有我已经去过这个部分和那里提供的解决方案 没有为我工作。 BULK INSERT with inconsistent number of columnsCan't identify reason for BULK INSERT errorsBULK INSERT with inconsistent number of columns

1 个答案:

答案 0 :(得分:1)

首先,要创建一个名为bob.dat的数据文件,您需要添加两列:EndDate和ProjDescription。另外,对于使用Unicode字符的批量复制操作,必须添加参数-W。 例如:

bcp "Select ProjectID,ManagerID,CompanyID,Title,StartDate, NULL AS EndDate, NULL AS ProjDescription from CATS.dbo.Project" queryout "C:\Users\Pawan\Documents\bob.dat" -Sbob-pc -T -n -w

原始格式文件:

<?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="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="24"/>
  <FIELD ID="2" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="24"/>
  <FIELD ID="3" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="24"/>
  <FIELD ID="4" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="100" COLLATION="Cyrillic_General_CI_AS"/>
  <FIELD ID="5" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="48"/>
  <FIELD ID="6" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="48"/>
  <FIELD ID="7" xsi:type="NCharTerm" TERMINATOR="\r\0\n\0" COLLATION="Cyrillic_General_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="ProjectID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="2" NAME="ManagerID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="3" NAME="CompanyID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="4" NAME="Title" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="5" NAME="StartDate" xsi:type="SQLDATETIME"/>
  <COLUMN SOURCE="6" NAME="EndDate" xsi:type="SQLDATETIME"/>
  <COLUMN SOURCE="7" NAME="ProjDescription" xsi:type="SQLNVARCHAR"/>
 </ROW>
</BCPFORMAT>

但是你想要一种方法只将数据填充到StartDate。因此,需要更改此文件:

<?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="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="24"/>
  <FIELD ID="2" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="24"/>
  <FIELD ID="3" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="24"/>
  <FIELD ID="4" xsi:type="NCharTerm" TERMINATOR="\t\0" MAX_LENGTH="100" COLLATION="Cyrillic_General_CI_AS"/>
  <FIELD ID="5" xsi:type="NCharTerm" TERMINATOR="\r\0\n\0" MAX_LENGTH="48"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="ProjectID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="2" NAME="ManagerID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="3" NAME="CompanyID" xsi:type="SQLINT"/>
  <COLUMN SOURCE="4" NAME="Title" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="5" NAME="StartDate" xsi:type="SQLDATETIME"/>
 </ROW>
</BCPFORMAT>