我有600万行数据要插入到SQL Server数据库中。我可以用6百万个INSERT语句方法慢慢地插入数据(根据我的计算需要18小时才能运行),或者我可以尝试使用BULK INSERT。
BULK INSERT存在无法转义字符的问题,但是在这种情况下,数据非常简单,所以不应该遇到此问题。
然而,SQL Server似乎不喜欢将任何形式的日期/时间数据插入到字段中。
以下是表格(伪SQL):
(为了易读性,重新格式化,并用4个空格替换制表符:)
(为了易读性,重新格式化,并用4个空格替换制表符:)
然而,当我运行BULK INSERT语句时,出现以下错误:
Msg 4864, Level 16, State 1, Line 2 Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 3 (Created).
我尝试了不同的行终止符和字段终止符以及各种不同的日期/时间格式(包括“01/01/2010”,“2010-01-01”,都带有或不带有“04:00:17”时间组件)。我不知道我在这里做错了什么。
BULK INSERT存在无法转义字符的问题,但是在这种情况下,数据非常简单,所以不应该遇到此问题。
然而,SQL Server似乎不喜欢将任何形式的日期/时间数据插入到字段中。
以下是表格(伪SQL):
CREATE TABLE Tasks (
TaskId bigint NOT NULL IDENTITY(1,1) PRIMARY KEY,
TriggerId bigint NOT NULL FOREIGN KEY,
Created datetime NOT NULL,
Modified datetime NOT NULL,
ScheduledFor datetime NULL,
LastRan datetime NULL,
-- and about 10 more fields after this
)
这是我的批量插入语句:
SET DATEFORMAT dmy
BULK INSERT Tasks
FROM 'C:\TasksBulk.dat'
WITH (
-- CHECK_CONSTRAINTS is not necessary as the only constraints are always enforced regardless of this option (UNIQUE, PRIMARY KEY, and NOT NULL)
CODEPAGE = 'RAW',
DATAFILETYPE = 'native',
KEEPIDENTITY,
MAXERRORS = 1,
ORDER ( CallId ASC ),
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\0'
)
这是TasksBulk.dat中的第一行数据:
1000\t1092\t01/01/2010 04:00:17\t01/01/2010 04:00:17\t\t01/01/2010 04:00:14\0
(为了易读性,重新格式化,并用4个空格替换制表符:)
(为了易读性,重新格式化,并用4个空格替换制表符:)
1000 1092 01/01/2010 04:00:17 01/01/2010 04:00:17 01/01/2010 04:00:14\0
然而,当我运行BULK INSERT语句时,出现以下错误:
Msg 4864, Level 16, State 1, Line 2 Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 3 (Created).
我尝试了不同的行终止符和字段终止符以及各种不同的日期/时间格式(包括“01/01/2010”,“2010-01-01”,都带有或不带有“04:00:17”时间组件)。我不知道我在这里做错了什么。