1

我正在尝试通过批量插入将一些数据导入 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:对不起文字墙;)

4

2 回答 2

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”作为最终终止符。

于 2012-06-05T22:31:08.117 回答
1

非 XML 批量插入文件非常挑剔。我看了你的,没有发现问题,但是很容易漏掉问题。

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

于 2009-04-16T03:48:50.280 回答