Ошибка массовой вставки SQL 4863 - PullRequest
1 голос
/ 16 апреля 2009

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

Сообщение 4864, Уровень 16, Состояние 1, Строка 1 Ошибка преобразования данных при массовой загрузке (несоответствие типов или недопустимый символ для указанной кодовой страницы) для строки 5902, столбца 2 (Тип).

ОК, так что обо всем по порядку:

а) данные поступают из парсера, который я встроил в C #. В этом файле есть 4 столбца, разделенных вкладками. Столбцы могут быть или не быть нулевыми. Сортировка UTF-8. Вот выдержка из этого.

D00486  DBLinks PubChem 7847552
D00486  DBLinks LigandBox   D00486
**D00487    Name        Pyridostigmine bromide (JP15/USP/INN)** -- WORKS
D00487  Name        Mestinon (TN)
D00487  Chemical    260.016 C9H13N2O2. Br
D00487  Target  PATH:hsa00564(43)
D00487  Remark      Therapeutic category: 1239
D00487  Remark      ATC code: N07AA02
D00487  Pathway PATH: map07220  Cholinergic and anticholinergic drugs
D00487  DBLinks CAS 101-26-8
D00487  DBLinks PubChem 7847553
D00487  DBLinks DrugBank    DB00545
D00487  DBLinks LigandBox   D00487
**D00488    Name        Pyrimethamine (JAN/USP/INN)** -- DOES **NOT** WORK!
D00488  Name        Daraprim (TN)

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

б) Это то, что я использую для создания таблицы:

CREATE TABLE [dbo].[KB] ([BEName] [nvarchar](1000) NOT NULL, [Type] [nvarchar](1000) NULL, [Name] [nvarchar](1000) NULL, [Value] [nvarchar](1000) NULL) ON [PRIMARY]

в) Это то, что я сейчас использую для импорта данных из файла:

DECLARE @SQL nvarchar(4000)
SET @SQL = 'BULK INSERT KB FROM ''C:\KB.xml'' WITH (FirstRow = 1, FORMATFILE = ''C:\out_KB.fmt'')';
EXEC(@SQL)

Мне пришлось вручную сгенерировать файл fmt, потому что по какой-то причине BCP не смог подключиться к моей базе данных (все еще прорабатывая основы на ней ...), поэтому возможно, что это не так, как должно быть. В любом случае, вот его содержимое:

9.0
4
1 SQLCHAR 0 100 "" 1 BEName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 500 "\t" 2 Type SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 500 "\t" 3 Name SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 500 "\n" 9 Value SQL_Latin1_General_CP1_CI_AS

Как я уже говорил, у меня нет большого опыта работы с BCP; изначально я просто использовал

BULK INSERT KB FROM ''C:\KB.xml'' WITH (FirstRow = 1, RowTerminator = ''\n'' , FieldTerminator = ''\t'')

но это все равно не сработает. Я все еще предпочел бы использовать это вместо файла FMT; Я гуглил и попробовал несколько хитростей (например, поменять \ n на \ n \ cr или ввести вместо него код ASCII \ n).

Есть идеи? Я не могу сказать, что у меня есть я, я истощен прямо сейчас, иду спать до полудня или около того: S (сейчас 4 часа утра).

Приветствия, товарищи, спасибо и заранее Hal

PS: Я думаю, что образцы в порядке, но, пожалуйста, будьте моим гостем и просите, что вам может понадобиться в любое время. PS2: простите за стену текста;)

Ответы [ 2 ]

2 голосов
/ 06 июня 2012

Старый поток, но для записи, я думаю, проблема была в файле формата OP. Он не определяет разделитель для первого ряда. Должно быть:

9.0
4
1 SQLCHAR 0 100 **"\t"** 1 BEName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 500 "\t" 2 Type SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 500 "\t" 3 Name SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 500 "\n" 9 Value SQL_Latin1_General_CP1_CI_AS

... без звездочек.

Для файлов из систем Windows обычно требуется «\ r \ n» для окончательного терминатора.

1 голос
/ 16 апреля 2009

Файлы массовой вставки без XML очень привередливы. Я посмотрел на вашу и не вижу проблемы, но проблемы легко пропустить.

С файлами массовой вставки XML намного проще работать. Можете ли вы выполнить рефакторинг своего кода для создания файлов массовой вставки XML вместо этого? Я также обнаружил, что вы также должны использовать файлы формата XML при использовании файлов вставки XML, и BCP не создаст это для вас - вы должны сами написать файл формата XML, но это довольно просто.

...