1

这是表的架构

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))
)

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

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 文件使用以下批量插入语句填充此表 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 列的任何数据。我希望这两列保持为空。不幸的是,当我运行批量插入语句时出现以下错误。

 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 列数不一致无法确定 BULK INSERT 错误的原因,BULK INSERT 列数不一致

4

1 回答 1

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>
于 2013-09-23T12:39:54.557 回答