【发布时间】:2011-10-31 10:34:08
【问题描述】:
我有 600 万行数据要插入到我的 SQL Server 数据库中。我可以使用 600 万条 INSERT 语句以缓慢的方式执行此操作(根据我的计算,它需要 18 小时才能运行),或者我可以尝试 BULK INSERT。
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
)
这是我的 BULK INSERT 语句:
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 个空格替换制表符重新格式化:)
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,级别 16,状态 1,行 2 批量加载数据转换错误 (指定代码页的类型不匹配或无效字符) 第 1 行,第 3 列(已创建)。
我尝试过使用不同的行和字段终止符以及每种不同的日期/时间格式(包括“01/01/2010”、“2010-01-01”,无论有无“04:00:17”时间零件)。我不知道我在这里做错了什么。
【问题讨论】:
标签: sql sql-server tsql bulkinsert