В SQL Server массовая вставка, как я могу использовать более высокие символы ASCII для терминаторов поля и строки - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть массовая вставка, которая работает на 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), независимо от того, что я пробовал.Я просто избавился от файла формата и теперь поместил дополнительные разделители полей в мой файл данных, чтобы представить столбцы, которые я не импортирую (у меня есть значения по умолчанию для этих столбцов).

1 Ответ

2 голосов
/ 02 февраля 2012

Указание DATAFILETYPE='widechar' внутри вашего блока WITH должно избавить вас от необходимости использовать файл формата, поскольку вы можете указать поле "widechar" и терминаторы строк в WITH BULK INSERT. Я ссылался на эту статью MSDN о формате символов Юникода для импорта данных.

BULK INSERT Database1.dbo.Table1
FROM 'C:\DataFile.dat'
WITH ( TABLOCK
   , CHECK_CONSTRAINTS
   , MAXERRORS = 0
   , DATAFILETYPE = 'widechar'
   , FIELDTERMINATOR = 'ù'
   , ROWTERMINATOR = 'ú'
)
...