У меня есть массовая вставка, которая работает на SQL Server 2000, которую я пытаюсь запустить на SQL Server 2008 R2, но она не работает, как я надеялся.Я успешно запустил эти массовые вставки в SQL 2000 со следующим:
Формат файла:
8.0
9
1 SQLCHAR 0 0 "ù" 1 Col1 ""
2 SQLCHAR 0 0 "ù" 2 Col2 ""
3 SQLCHAR 0 0 "ù" 3 Col3 ""
4 SQLCHAR 0 0 "ù" 4 Col4 ""
5 SQLCHAR 0 0 "ù" 5 Col5 ""
6 SQLCHAR 0 0 "ú" 6 Col6 ""
7 SQLCHAR 0 0 "" 0 Col7 ""
8 SQLCHAR 0 0 "" 0 Col8 ""
9 SQLCHAR 0 0 "" 0 Col9 ""
Файл данных:
101ù110115100ùC02BCD72-083E-46EE-AA68-848F2F36DB4Dù0ù1ùCú
Команда массовой вставки:
bulk insert Database1.dbo.Table1
from 'C:\DataFile.dat'
with
(
formatfile = 'C:\FormatFile.fmt'
, tablock
, check_constraints
, maxerrors = 0
)
Теперь, когда я работаю на коробке SQL 2008 R2, я получаю следующую ошибку:
Bulk load: An unexpected end of file was encountered in the data file.
Если я изменю свои терминаторы поля с ascii 249 (ù) запятыми (,) и измените мои разделители строк с ascii 250 (ú) на точки с запятой (;), все будет работать.Однако на самом деле это не вариант (данные будут содержать эти символы), и я бы предпочел не выбирать произвольную строку, например! @ # $% ^ & * () Для моих разделителей (придется редактировать больше кодатаким образом).
Я пробовал несколько комбинаций кодовой страницы, типа файла данных, сопоставления, уровня SQL-формата и версии формата файла, но безрезультатно (не то, чтобы у меня был опыт, чтобы знать, как все они будут взаимодействоватьизменить что-нибудь здесь).В различных разделах документации MSDN о массовых вставках содержатся специальные правила, касающиеся символов ascii больше 127 или меньше 32, но я не совсем понимаю, как это повлияет на разделители.
Что можно сделать, чтобы коснутьсякак можно меньше кода, но заставить его работать на моем новом сервере?
ОБНОВЛЕНИЕ (решение)
Благодаря комментарию @Adam Wenger, я нашел решение.Чтобы справиться с наличием расширенных символов ASCII в моих данных, я больше не использую файл форматирования и записываю файл данных массовой вставки как Unicode (не ANSI) в файловую систему (хотя на самом деле их нетсимволы Юникода в моих данных).Вот мой новый оператор массовой вставки (примечание 'widechar'):
bulk insert Database1.dbo.Table1
from 'C:\DataFile.dat'
with (
check_constraints
, datafiletype = 'widechar'
, fieldterminator = 'ù'
, maxerrors = 0
, rowterminator = 'ú'
, tablock
)
Мне не удалось получить файл формата для работы с расширенными символами ASCII (выше 127), независимо от того, что я пробовал.Я просто избавился от файла формата и теперь поместил дополнительные разделители полей в мой файл данных, чтобы представить столбцы, которые я не импортирую (у меня есть значения по умолчанию для этих столбцов).