2016-09-12 15 views
1

私はバルクにしようとしています次の列一括挿入は

create table raw.sub_brand_channel_mapping 
(
    ImportFileId int NULL, 
    [sub_brand_id] int , 
    [sub_brand_name] [nvarchar](1024) , 
    [channel_country_id] int , 
    [channel_id] int, 
    [channel_name] [nvarchar](1024) , 
    [status] [varchar](1024) , 
    [eff_start_date] date , 
    [eff_end_date] date 
) 

.csvファイルを挿入している私のSQL Serverのテーブルを持っています。私のテーブルには9列あり、私のCSVデータファイルには8列あります。最初の列 "ImportFileId"は後で入力されるはずです。この目的のために、私は以下のような形式のファイルを使用しています。

10.0 
8 
1  SQLCHAR   0  1000  "|"  2 sub_brand_id       "" 
2  SQLCHAR   0  2000  "|"  3 sub_brand_name      SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR   0  2000  "|"  4 channel_country_id     "" 
4  SQLCHAR   0  2000  "|"  5 channel_id       "" 
5  SQLCHAR   0  2000  "|"  6 channel_name       SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR   0  2000  "|"  7 status        SQL_Latin1_General_CP1_CI_AS 
7  SQLCHAR   0  2000  "|"  8  eff_start_date       "" 
8  SQLCHAR   0  2000  "\r\n"  9  eff_end_date        "" 

第1列が空のままであることが分かる。データをutf-8エンコーディングとして使用してBULK INSERTを使用すると、BULK INSERTは成功します。ただし、SQL Serverバージョン12ではutf-8エンコーディングがサポートされていないため、データ内の特殊文字が変更されます。

元のデータを維持するために、私はエンコードをutf-16に変換します。しかし、私は、同じ形式のファイルと同じBULK INSERTコマンドを使用するとき、私はエラーを取得:

BULK INSERT <table> FROM <data_path> 
WITH ( 
    FORMATFILE = <Format_File_path> 
    FIRSTROW = 2, 
    LASTROW = 3 
) 

P.S.:

Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 1 (sub_brand_id).

マイ一括挿入クエリは次のようになります私のデータには特殊文字、奇妙な中国語と日本語の名前、ポルトガル語とスペイン語のミックスがあります。データを不変のままにするために、私はutf-16を使う必要があります。

誰もがこれに理由と解決策を提供できますか?頭の上から

答えて

0

、いくつかの提案:

あなたはbulk insert文のWITH句にdatafiletype = 'widechar'を追加することができます。ただし、データファイルにBOMがあるかどうかによって、SQL Serverの動作が異なる可能性があるため、これは難しい場合があります。両方のケースをテストする方が良いでしょう。

それでも問題が解決しない場合は、フォーマットファイルの列定義をSQLNCHARに変更しようとします(これについてはわかりません)。

+0

私は上記の両方の提案を試しました。しかし、それは両方のために動作しません! P.P. - 私のテーブルが私のデータファイルの列と同じ数の列を持っていて、私はBULK INSERTを行います。それは動作します。 –