我试图通过批量插入将一些数据导入SQL Server 2008,但我遇到了大量的转换错误:
Msg 4864,Level 16,State 1,Line 1 第5902行,第2列(类型)的批量加载数据转换错误(类型不匹配或指定代码页的无效字符)。
首先确定第一件事:
a)数据来自我用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)
倒数第二行会生成一条错误消息,就像我之前向您展示的那样。 令我惊讶的是,我放在粗体上的另一条线非常相似,但不会产生任何错误。
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文件;我用Google搜索并尝试了几个技巧(例如用\ n \ cr交换\ n或引入\ n的ASCII代码)。
有什么想法吗?我不能说我没有,我现在已经筋疲力尽了,要睡到中午或者其他什么:S(现在是凌晨4点)。
干杯队友,谢谢,挺进 哈尔
PS:我认为样品还可以,但请成为我的客人并随时要求您提供所需的样品。 PS2:抱歉文字墙;)
答案 0 :(得分: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”表示最终终结符。
答案 1 :(得分:1)
非XML批量插入文件非常挑剔。我看着你的,没有看到问题,但很容易错过问题。
XML批量插入文件更容易使用。您是否可以重构代码以生成XML批量插入文件?我还发现在使用XML插入文件时也必须使用XML格式文件,而BCP不会为您创建 - 您必须自己编写XML格式文件,但这很容易。