У меня есть 6 миллионов строк данных, которые я хочу вставить в свою базу данных SQL Server . Я могу сделать это медленно, используя 6 миллионов операторов INSERT (по моим расчетам, это займет 18 часов), или я могу попробовать BULK INSERT.
BULK INSERT имеет проблемы с невозможностью экранирования символов, но данные в этот случай очень прост и поэтому не должен сталкиваться с этой проблемой.
Однако SQL Server, похоже, не любит вставлять какие-либо данные даты / времени в поле.
Вот таблица (psuedo -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, Level 16, State 1, Line 2 Ошибка преобразования данных массовой загрузки. (несоответствие типа или недопустимый символ для указанной кодовой страницы) для строка 1, столбец 3 (Создано).
Я пробовал использовать разные терминаторы строк и полей и все разные форматы даты и времени (включая «01.01.2010», «01.01.2010», как с, так и без компонент времени «04:00:17»). Не знаю, что я здесь делаю не так.