Неожиданный EOF обнаружен в BCP

Попытка импортировать данные в Azure. Создал текстовый файл в Management Studio 2005. Я пробовал текстовый файл с разделителями-запятыми и табуляцией.

BCP IN -c -t, -r\n -U -S -P Я получаю сообщение об ошибке {SQL Server Native Client 11.0] Неожиданный EOF в файле данных BCP

Вот скрипт, который я использовал для создания файла:

 SELECT top 10  [Id]
      ,[RecordId]
      ,[PracticeId]
      ,[MonthEndId]
      ,ISNULL(CAST(InvoiceItemId AS VARCHAR(50)),'') AS InvoiceItemId
      ,[Date]
      ,[Number]
      ,[RecordTypeId]
      ,[LedgerTypeId]
      ,[TargetLedgerTypeId]
      ,ISNULL(CAST(Tax1Id as varchar(50)),'')AS Tax1Id
      ,[Tax1Exempt]
      ,[Tax1Total]
      ,[Tax1Exemption]
      ,ISNULL(CAST([Tax2Id] AS VARCHAR(50)),'') AS Tax2Id
      ,[Tax2Exempt]
      ,[Tax2Total]
      ,[Tax2Exemption]
      ,[TotalTaxable]
      ,[TotalTax]
      ,[TotalWithTax]
      ,[Unassigned]
      ,ISNULL(CAST([ReversingTypeId] AS VARCHAR(50)),'') AS ReversingTypeId
      ,[IncludeAccrualDoctor]
      ,12 AS InstanceId
  FROM <table>

Вот таблица, в которую он вставлен

CREATE TABLE [WS].[ARFinancialRecord](
    [Id] [uniqueidentifier] NOT NULL,
    [RecordId] [uniqueidentifier] NOT NULL,
    [PracticeId] [uniqueidentifier] NOT NULL,
    [MonthEndId] [uniqueidentifier] NOT NULL,
    [InvoiceItemId] [uniqueidentifier] NULL,
    [Date] [smalldatetime] NOT NULL,
    [Number] [varchar](17) NOT NULL,
    [RecordTypeId] [tinyint] NOT NULL,
    [LedgerTypeId] [tinyint] NOT NULL,
    [TargetLedgerTypeId] [tinyint] NOT NULL,
    [Tax1Id] [uniqueidentifier] NULL,
    [Tax1Exempt] [bit] NOT NULL,
    [Tax1Total] [decimal](30, 8) NOT NULL,
    [Tax1Exemption] [decimal](30, 8) NOT NULL,
    [Tax2Id] [uniqueidentifier] NULL,
    [Tax2Exempt] [bit] NOT NULL,
    [Tax2Total] [decimal](30, 8) NOT NULL,
    [Tax2Exemption] [decimal](30, 8) NOT NULL,
    [TotalTaxable] [decimal](30, 8) NOT NULL,
    [TotalTax] [decimal](30, 8) NOT NULL,
    [TotalWithTax] [decimal](30, 8) NOT NULL,
    [Unassigned] [decimal](30, 8) NOT NULL,
    [ReversingTypeId] [tinyint] NULL,
    [IncludeAccrualDoctor] [bit] NOT NULL,
    [InstanceId] [tinyint] NOT NULL,
 CONSTRAINT [PK_ARFinancialRecord] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

На самом деле существует несколько сотен тысяч фактических записей, и я сделал это с другого сервера, единственная разница заключается в версии Management Studio.


person alemus    schedule 13.10.2014    source источник
comment
stackoverflow.com /вопросы/52295174/   -  person jophab    schedule 12.09.2018


Ответы (10)


Если файл разделен табуляцией, флаг командной строки для разделителя столбцов должен быть -t\t -t,

person maxymoo    schedule 30.07.2015
comment
должно быть -t"\t"? Как я сделал -S"ServerName" -U"UserName"? Кроме того, что такое -t,? - person J.S. Orris; 05.08.2015
comment
нет, не используйте кавычки, -t это сокращение от терминатора поля, я думаю - person maxymoo; 06.08.2015
comment
На самом деле значения, разделенные tab, являются значением по умолчанию для bcp, поэтому вам вообще не нужно указывать какие-либо -t и -r. Это то, что я испытал на себе - person Daria; 23.03.2016

«Неожиданный EOF» обычно означает, что терминатор столбца или строки не соответствует вашим ожиданиям. То есть ваши аргументы командной строки для них соответствуют файлу.

Типичные причины:

  • Окончания строк Unix и Windows
  • Текстовые данные, содержащие разделитель столбцов (запятая в фактических данных)
  • Или смесь двух.

SSMS не должна иметь к этому никакого отношения: важен формат (ожидаемый и фактический).

person gbn    schedule 13.10.2014
comment
Ну, я открыл его в Notepad ++, а разделитель строк - CRLF. Я не мог найти встроенных запятых, но получал ту же ошибку, когда я разделял ее табуляцией. - person alemus; 15.10.2014
comment
@alemus: в вашей командной строке есть -r\n, что означает LF. Возможно, CR что-то путает. - person gbn; 15.10.2014

Просто к сведению, что я столкнулся с той же самой ошибкой, и оказалось, что моя целевая таблица содержит один дополнительный столбец, чем файл DAT!

person Scooter    schedule 01.02.2017

В каждом случае, когда я сталкивался с этой ошибкой, это заканчивалось проблемой, когда количество столбцов в таблице не соответствовало количеству столбцов, разделенных в текстовом файле. Самый простой способ убедиться в этом — загрузить текстовый файл в Excel и сравнить количество столбцов с количеством столбцов в таблице.

person Clark Vera    schedule 16.07.2018
comment
Я обнаружил, что мне нужно добавить заполнитель для значения столбца идентификатора в файле импорта, даже если это автоматически сгенерированный столбец индекса. Кажется, нужен этот заполнитель. - person Andrew Schultz; 22.01.2021

Я думаю, что большинство из нас предпочитает реальные примеры синтаксическим подсказкам, поэтому вот что я сделал:

bcp LoadDB.dbo.test в C:\temp\test.txt -S 123.66.108.207 -U testuser -P testpass -c -r /r

Мои данные были извлечены из базы данных Oracle на основе Unix, которая была разделена табуляцией и имела символ конца строки LF.

Поскольку мои данные были разделены табуляцией, я не указал параметр -t, по умолчанию в bcp используется табуляция.

Поскольку мой терминатор строки был символом LineFeed (LF), я использовал -r /r

Поскольку все мои данные загружались в поля char, я использовал параметр -c.

person Dave Fish    schedule 08.03.2017

Поделюсь своим опытом в этом вопросе. Мои пользователи присылали мне кодировку UTF-8, и все работало нормально. Моя загрузка начала давать сбой, когда они обновили кодировку до Encode в UCS-2 LE BOM. Используйте notepad++, чтобы проверить эти настройки.

Возврат к UTF-8 решил мою проблему.

Эта ссылка помогла мне решить проблему проблема.

введите здесь описание изображения

person ProgSky    schedule 19.09.2018
comment
Это помогло решить проблему. Благодарность - person Venkataraman R; 22.02.2021

Откройте файл CSV в EXCEL и «сохраните как» новый файл CSV.

введите здесь описание изображения

person Hussain    schedule 22.08.2019

Я столкнулся с той же ошибкой при попытке выполнить bcp в записях из файла данных в таблицу. Обходной путь, который работает, - просто открыть файл в Notepad ++ или аналогичном редакторе и добавить дополнительную строку в конец файла. Это сработало для моего случая - разделитель полей - |^|, разделитель строк - новая строка (LRCF).

Используемая команда: bcp in -T -c -t"|^|"

person user12891176    schedule 13.02.2020

В моем случае проблема заключалась в том, что запись, которую я пытался импортировать, имела недопустимый внешний ключ.

person richardprocter    schedule 11.03.2021

Ответ на эту загадку коварен. Я потратил время, которое я никогда не смогу вернуть...

Если вы работаете в Windows, используйте NotePad++ и в разделе «Кодировка» в меню измените его на [UCS-2 LE BOM] — LE = Little Endian...

Такая ненавистная ошибка! И я только что установил SQL Server 2019 и последние инструменты SQLCMD/BCP. Кажется, эта ошибка существует уже некоторое время.

Этот парень спас мне жизнь: https://shades-of-orange.com/post/Unexpected-EOF-encountered-in-BCP-data-file

person Coffee and Code    schedule 15.07.2021