質問
バルクインサートを使用して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」が必要です。