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错误,并且不知道发生了什么。
答案 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