首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未能批量插入XML模型

未能批量插入XML模型
EN

Stack Overflow用户
提问于 2017-12-15 09:39:09
回答 1查看 320关注 0票数 1

我试图使用BULK INSERT在Server表中插入大量带有元数据的二进制文件。我只想指定要使用的列的子集(最重要的是,PK是一个UniqueIdentifier,我希望Server生成这个字段)。所以我必须使用一个模型文件。

不使用模型文件(为所有列输入数据)可以很好地处理该文件:

代码语言:javascript
运行
复制
00000000-F436-49D0-B5A9-02DAB2E03F45, B, , , , JVBERio4MjEzNQ0KJSVFT0Y=, 109754, 2017-12-14 14:53:23, 2017-12-14 14:53:23, number, name

这一声明是:

代码语言:javascript
运行
复制
BULK INSERT Documents
FROM 'c:\temp\testdata.txt'
WITH
(
  FIELDTERMINATOR = ',',
  ROWTERMINATOR = '\n',
  ROWS_PER_BATCH = 1000, 
  FIRSTROW = 1,
  TABLOCK
)

但是当我尝试使用一个模型文件时,我遇到了两个不同的问题。首先,当使用指定所有列的模型文件时:

代码语言:javascript
运行
复制
<?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>

这一声明是:

代码语言:javascript
运行
复制
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)".`”获取行

在使用这个简化的模型文件(以及一个值较少的文本文件)时:

代码语言:javascript
运行
复制
<?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的隐式转换。使用转换函数运行此查询。

EN

回答 1

Stack Overflow用户

发布于 2017-12-15 12:10:35

我建议将这些数据导入到一个容忍的暂存表中,然后从那里继续。只有一种看法:

代码语言:javascript
运行
复制
<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"> 

对应

代码语言:javascript
运行
复制
<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>定义不一致。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47829486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档