2009-04-16 122 views
1

我想通过批量插入的方式导入一些数据到SQL Server 2008,但我已经得到一吨的转换错误:SQL批量插入错误4863

消息4864,级别16,状态1,第1行 行5902第2列(类型)的批量加载数据转换错误(类型不匹配或指定代码页的字符无效)。

行,所以首先第一件事情:

一)数据来自一个解析器我建在C#。在这个文件中,有4列,由制表符分隔。这些列可能不是null。整理是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) 

倒数第二排产生像我以前出你的错误消息。 真正让我感到惊讶的是,我放在粗体中的另一条线非常相似,但不会产生任何错误。

B)这是我用来创建表的内容:

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

C)这就是我目前使用从文件导入数据:

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 \ cr替换\ n或者改为引入\ n的ASCII码)。

任何想法?我不能说我没有,我现在筋疲力尽,一直睡到中午或某事:S(现在是凌晨4点)。

干杯队友,感谢并提前 哈尔

PS:我认为样品是好的,但请我的客人,并要求你可能需要在任何时间什么。 PS2:对不起墙上的文字;)

回答

1

非XML批量插入文件非常挑剔。我看着你的,并没有看到问题,但很容易错过问题。

XML批量插入文件更易于使用。你能重构你的代码来生成XML批量插入文件吗?我还发现,在使用XML插入文件时,您还必须使用XML格式的文件,BCP不会为您创建 - 您必须自己编写XML格式文件,但这很容易。

+0

好主意,谢谢。 有一天我必须实现它,现在我已经设法通过任务的GUI导入数据。 再次感谢 – 2009-04-16 15:41:45

2

旧的线程,但为了记录,我相信问题是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”作为最终的终结符。

+0

感谢您的意见,即使迟到:) – 2012-06-06 10:55:25