Вопрос

Я пытаюсь набросать данные вставки в базу данных SQL Server Express. При выполнении BCP из командной строки Windows XP я получаю следующую ошибку:

C:  Temp> BCP в -T -F -S Начальная копия ... SQLState = S1000, NANANEMERROR = 0 Ошибка = [Microsoft] [NANY CLEAND CLEAND] [SQL] Неожиданные EOF, встречающиеся в BCP-файле данных 0, скопированные. Размер сетевого пакета (байты): 4096 часов времени (MS.) Всего: 4391

Итак, возникает проблема с EOF. Как добавить правильный символ EOF в этот файл, используя Perl или Python?

Это было полезно?

Решение

EOF - конец файла. Наверное, произошло, это то, что файл не завершен; Программное обеспечение ожидает данных, но их больше не было.

Эти виды вещей происходят, когда:

  • Экспорт прерывается (бросить программное обеспечение сброса при сбросе)
  • Копирование дамба, прерывая копию
  • диск полный во время дамп

Эти виды вещей.

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

РЕДАКТИРОВАТЬ Бесстыдно скопировано с комментария, предоставленного Джоном Машином

Это может произойти (неоднозначно) в реальных файлах. Все, что ему нужно, это (1) пользователь ввода данных для ввода Ctrl-Z по ошибке, ничего не смотрите на экране, введите предполагаемый Shift-Z и продолжайте идти и (2) программное обеспечение Vavelation (например, Nepwew ) Что радостно принимает Ctrl-AnyKey в текстовых полях, и в вашей базе данных в нем есть небольшая бомба, просто ждет, пока кто-то создает запрос в плоский файл.

Другие советы

Неожиданные EOF означает, что BCP-ридер нашел EOF, когда ожидается больше данных. Этот EOF может быть:

(1) Фактический физический конец-файл (больше нет байтов для чтения). Это означает, что у вас неправильно отформатированные данные. Проверьте в конце вашего файла для неполной записи.

ИЛИ

(2) В Windows, где вы находитесь, программы, чтение файла в текстовом режиме, честь древней конвенции, унаследованной через MS-DOS из CP / M относительно CTRL-Z (aka ^ z aka 'x1a' aka sub aka заменитель) как Конец файлового маркера при чтении из любого файла не просто терминал. Это включает в себя Python - поведение определяется C Stdlib. Проверьте « x1a» в ваших данных.

Обновлять Отвечая на комментарии в разборчивой моде:

В Notepad ++ вы можете сделать его отображать необычные символы, сделав символ / шоу / показать все символы. Вы можете выполнить поиск, выполнив Ctrl-F, набрав x1a в Find какую коробку и выбирая расширенную переключатель на панели поиска.

Или вы можете с небольшим количеством Python получить номер первого Ctrl-Z:

bytes = open('bcp.dat', 'rb').read()
zpos = bytes.find('\x1a')
# if zpos is -1, no Ctrl-Z in file
print 1 + bytes[:zpos].count('\r\n')

Где ваш .dat был создан, не имеет значения. Непреднамеренная Ctrl-Z может произойти в любом месте файла, созданного в любой операционной системе. Именно там, где он читается как текстовый файл, который имеет значение - Windows? Хлопнуть!

Это не проблема с отсутствующими eof, но с eof то есть и не ожидается BCP.

Я не эксперт инструмента BCP, но похоже, что есть некоторая проблема с форматом ваших файлов данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top