我正在尝试通过批量插入将一些数据导入 SQL Server 2008,但我遇到了大量的转换错误:
消息 4864,级别 16,状态 1,第 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 文件;我用谷歌搜索并尝试了一些技巧(例如将 \n 与 \n\cr 交换或引入 \n 的 ASCII 代码)。
有任何想法吗?我不能说我有,我现在筋疲力尽,要睡到中午什么的:S(现在是凌晨 4 点)。
干杯队友,谢谢并提前哈尔
PS:我认为样品还可以,但请成为我的客人,随时索取您可能需要的东西。PS2:对不起文字墙;)