使用xml格式文件将BCP文件导入SQL表会导致错误

时间:2014-09-25 21:08:37

标签: sql-server csv bcp data-import

BCP总是让我感到困扰,经过多次尝试后,我正在进行一项简单的测试,导致“无法转换为规范的字符值”错误。似乎无法确定问题所在。

首先,我有一个SQL SERVER表

CREATE TABLE [dbo].[customDataFromAPI](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [periodStartUTC] [datetimeoffset](7) NULL,
    [M1] [nvarchar](50) NULL,
    [M2] [nvarchar](50) NULL,
    [M3] [nvarchar](50) NULL,
    [M4] [nvarchar](30) NULL,
    [M5] [nvarchar](40) NULL,
    [M6] [nvarchar](30) NULL,
    [M7] [bigint] NULL,
    [M8] [bigint] NULL,
 CONSTRAINT [PK_customDataFromAPI] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)

我还有以下CSV文件作为示例,

PeriodStart,C1,C2,C3,C4,C5,C6,C7,C8
2014-04-01T04:00:00.000Z,Kuber TEST,Another String Text Field,Quebec,Internal Server Name222,test service,TestingNowss,123178594823,12312

我正在使用这个XML格式文件进行bcp导入:

<?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="24"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/>
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/>
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="40"/>
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/>
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/>
  <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="18"/>
  <FIELD ID="9" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="18"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="periodStartUTC" xsi:type="SQLDATETIMEOFFSET"/>
  <COLUMN SOURCE="7" NAME="nbiApplicationType" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="2" NAME="applicationType" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="3" NAME="applicationProtocol" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="4" NAME="elementCluster" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="5" NAME="element" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="6" NAME="clientDevice" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="8" NAME="totalBytesDown" xsi:type="SQLBIGINT"/>
  <COLUMN SOURCE="9" NAME="totalBytesUp" xsi:type="SQLBIGINT"/>
 </ROW>
</BCPFORMAT>

我正在运行以下BCP命令:

bcp SERVER_NAME.dbo.customDataFromAPI in C:\test_dataFile.csv -t, -f C:\test_format.xml -S SERVER_NAME -T -F2

我曾尝试使用SSIS,但它运行良好但速度非常慢,因为我有大约2亿个这样的行要处理。作为替代方案,我想了解并将bcp用于测试,但到目前为止还无法导入单行数据。有时我也会遇到BCP臭名昭着的EOF错误,并且不知道发生了什么。

1 个答案:

答案 0 :(得分:0)

好的,这是因为bcp实际上是在尝试将第一列(sqldatetimeoffset)插入标识列,因为在使用XML格式文件时它不会跳过它。文档说:

  

使用XML格式文件时,您无法跳过列   使用bcp命令或BULK直接导入表   INSERT语句。

解决方案是使用“旧样式”格式文件,允许您定义要跳过的列,或通过视图插入:

CREATE VIEW SkipCol AS 
SELECT periodStartUTC, M1, M2, M3, M4, M5, M6, M7, M8 FROM customDataFromAPI;

然后bcp到那个:

bcp SERVER_NAME..SkipCol in C:\test_dataFile.csv -t, -f C:\test_format.xml -S SERVER_NAME -T -F2