0

У меня есть объемная вставка, которая работает на SQL Server 2000, которую я пытаюсь запустить на SQL Server 2008 R2, но она не работает как Я надеялся. Я успешно работает эти объемные вставки в SQL Server 2000 со следующим:В объемной вставке SQL Server, как использовать более высокие символы ASCII для терминаторов Field и Row

Формат файла:

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 команда вставки:

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. 

Если я меняю поле терминаторов из 249 ASCII (U) в запятые (,) и изменить мои строки терминаторов из ASCII 250 (U) до точки с запятой (;), все будет работать. Тем не менее, это не вариант (данные, безусловно, будут содержать эти символы), и я бы предпочел не выбирать какую-либо произвольную строку, например: @ # $%^& *() для моих разделителей (нужно отредактировать больше кода сюда).

Я пробовал несколько комбинаций кодовой страницы, файла данных, сопоставления, уровня совместимости sql и формата файла, но безрезультатно (не то, что у меня есть опыт, чтобы знать, как все это будет взаимодействовать, чтобы что-то изменить здесь). Различные части объемных вставных документов MSDN относятся к специальным правилам, касающимся символов ascii, превышающих 127 или менее 32, но я не могу понять, как это повлияет на разделители.

Что я могу сделать, чтобы набрать как можно меньше кода, но заставить его работать на моем новом сервере?

UPDATE (раствор)

Благодаря комментарий @Adam Венгера, я нашел решение. Чтобы иметь дело с имеющимися extended ASCII символами в моих данных, я больше не использую файл формата, и я пишу файл данных объемной вставки как unicode (не ANSI) в файловую систему (хотя в моих данных нет никаких символов unicode). Вот мое новое заявление основной вставки (уведомление «WideChar»):

bulk insert Database1.dbo.Table1 
from 'C:\DataFile.dat' 
with (
     check_constraints 
    , datafiletype = 'widechar' 
    , fieldterminator = 'ù' 
    , maxerrors = 0 
    , rowterminator = 'ú' 
    , tablock 
) 

Я не мог получить формат файл для работы с расширенными символами ASCII (выше 127), независимо от того, что я пытался. Я просто избавился от файла формата и теперь помещаю дополнительные разделители полей в свой файл данных для представления столбцов, которые я не импортирую (у меня есть значения по умолчанию для этих столбцов).

+1

Посмотрите на указание 'DATAFILETYPE = 'widechar'' внутри блока' WITH'. [Эта статья] (http://msdn.microsoft.com/en-us/library/ms188289.aspx) выглядит многообещающей. –

+0

@ Адам Венгер, ты указал мне в правильном направлении. Благодаря! Не стесняйтесь создавать ответ с комбо из вашего предложения и моего обновления. –

ответ

2

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

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