質問

バルクインサートを使用してSQL Server 2008にデータをインポートしようとしていますが、大量の変換エラーが発生しています。

MSG 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)

2番目から最後の行は、私が以前に示したようなエラーメッセージを生成します。私が本当に驚いているのは、私が太字に置いた他のラインが非常に似ているが、エラーをまったく生成しないということです。

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)

何らかの理由でBCPが私のデータベースに接続できなかったため(それでも基本を進めています...)、FMTファイルを手動で生成する必要がありました。いずれにせよ、ここに内容があります:

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と交換したり、代わりに nのASCIIコードを導入したりしました)。

何か案は?私は私が持っているとは言えません、私は今疲れ果てています、正午まで眠りにつくか:S(今は午前4時です)。

乾杯の仲間、ありがとう、そしてアドバンスハル

PS:サンプルは大丈夫だと思いますが、ゲストになって、いつでも必要なものをリクエストしてください。 PS2:テキストの壁にごめんなさい;)

役に立ちましたか?

解決

非XMLバルクインサートファイルは非常に気味が悪いです。私はあなたのものを見ましたが、問題はありませんが、問題を見逃すのは簡単です。

XML Bulk-Insertファイルは、操作がはるかに簡単です。代わりにXMLバルクインサートファイルを作成するためにコードをリファクタリングできますか?また、XML Insertファイルを使用するときにXML形式のファイルを使用する必要があることもわかりました。BCPはそれを作成しません。自分でXMLフォーマットファイルを記述する必要がありますが、非常に簡単です。

他のヒント

古いスレッドですが、記録のために、問題は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」が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top