У меня есть 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, я получаю эту ошибку:
Сообщение 4864, Уровень 16, Состояние 1, Строка 2 Ошибка преобразования данных при массовой загрузке (несоответствие типов или недопустимый символ для указанной кодовой страницы) для строки 1, столбца 3 (Создано).
Я пробовал использовать разные терминаторы строк и полейи каждый другой формат даты / времени (включая «01/01/2010», «2010-01-01», как с компонентом времени «04:00:17», так и без него).Я не знаю, что я делаю здесь не так.