我试图使用BULK INSERT
在Server表中插入大量带有元数据的二进制文件。我只想指定要使用的列的子集(最重要的是,PK是一个UniqueIdentifier
,我希望Server生成这个字段)。所以我必须使用一个模型文件。
不使用模型文件(为所有列输入数据)可以很好地处理该文件:
00000000-F436-49D0-B5A9-02DAB2E03F45, B, , , , JVBERio4MjEzNQ0KJSVFT0Y=, 109754, 2017-12-14 14:53:23, 2017-12-14 14:53:23, number, name
这一声明是:
BULK INSERT Documents
FROM 'c:\temp\testdata.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
ROWS_PER_BATCH = 1000,
FIRSTROW = 1,
TABLOCK
)
但是当我尝试使用一个模型文件时,我遇到了两个不同的问题。首先,当使用指定所有列的模型文件时:
<?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="NativePrefix" PREFIX_LENGTH="1"/>
<FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="NCharPrefix" PREFIX_LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="NativeFixed" LENGTH="4"/>
<FIELD ID="8" xsi:type="NativeFixed" LENGTH="8"/>
<FIELD ID="9" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
<FIELD ID="10" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="DocumentId" xsi:type="SQLUNIQUEID"/>
<COLUMN SOURCE="2" NAME="DocumentType" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="CompanyCode" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="CustomerNumber" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="OrderNumber" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="Data" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="Size" xsi:type="SQLINT"/>
<COLUMN SOURCE="8" NAME="Created" xsi:type="SQLDATETIME"/>
<COLUMN SOURCE="9" NAME="Modified" xsi:type="SQLDATETIME"/>
<COLUMN SOURCE="10" NAME="InvoiceNumber" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="Title" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
这一声明是:
BULK INSERT Documents
FROM 'c:\Temp\testiness.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
ROWS_PER_BATCH = 1000,
FIRSTROW = 1,
TABLOCK,
FORMATFILE = 'c:\Temp\modeltest.xml'
);
GO
我知道这个错误:
Msg 4866,第16级,第7状态,第1行 大容量装载失败。列在第1行第2列的数据文件中太长。请验证字段终止符和行终止符的指定是否正确。 Msg 7399,第16级,状态1,第1行 OLE DB提供程序"BULK“用于链接服务器"(null)”报告了一个错误。提供程序没有提供有关错误的任何信息。 Msg 7330,第16级,状态2,第1行 无法从OLE DB提供程序中为链接服务器"BULK“(null)".`”获取行
在使用这个简化的模型文件(以及一个值较少的文本文件)时:
<?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="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="NCharPrefix" PREFIX_LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="NativeFixed" LENGTH="4"/>
<FIELD ID="7" xsi:type="NativeFixed" LENGTH="8"/>
<FIELD ID="8" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
<FIELD ID="9" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="DocumentType" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="2" NAME="CompanyCode" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="CustomerNumber" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="OrderNumber" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="Data" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="Size" xsi:type="SQLINT"/>
<COLUMN SOURCE="7" NAME="Created" xsi:type="SQLDATETIME"/>
<COLUMN SOURCE="8" NAME="Modified" xsi:type="SQLDATETIME"/>
<COLUMN SOURCE="9" NAME="Title" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
我得到:
Msg 257,第16级,状态3,第1行 不允许从数据类型datetime到int的隐式转换。使用转换函数运行此查询。
发布于 2017-12-15 12:10:35
我建议将这些数据导入到一个容忍的暂存表中,然后从那里继续。只有一种看法:
<FIELD ID="7" xsi:type="NativeFixed" LENGTH="8"/>
<FIELD ID="8" xsi:type="NativePrefix" PREFIX_LENGTH="1"/>
<FIELD ID="9" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100">
对应
<COLUMN SOURCE="7" NAME="Size" xsi:type="SQLINT"/>
<COLUMN SOURCE="8" NAME="Created" xsi:type="SQLDATETIME"/>
<COLUMN SOURCE="9" NAME="Modified" xsi:type="SQLDATETIME"/>
Nr 7似乎是一个INT
(虽然8字节很大),而8和9点日期值(按列名和类型),而<FIELD>
定义不一致。
https://stackoverflow.com/questions/47829486
复制相似问题