2016-09-12 15 views
1

我在SQL Server中的表有以下几列UTF-8的批量插入VS UTF-16编码数据

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文件。我的表有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        "" 

可以看出,第一列留空。当我使用BULK INSERT将数据用作utf-8编码时,我的BULK INSERT成功。但是,由于SQL Server版本12不支持utf-8编码,因此数据中的特殊字符会发生更改。

为了保持原始数据,我将编码转换为utf-16。然而,当我用同样的BULK INSERT命令具有相同格式的文件,我得到一个错误:

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

我的批量插入查询看起来是这样的:

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

附:我的数据确实有特殊的字符,中文和日文的奇怪名称,葡萄牙语和西班牙语混合。为了保持数据不被污染,我需要使用utf-16。

任何人都可以提供一个原因和解决方案吗?

回答

0

落头的顶部,有几个建议:

您可以添加datafiletype = 'widechar'bulk insert语句的WITH条款。但是,这可能会非常棘手,因为根据数据文件是否具有BOM,SQL Server行为可能会有所不同。测试两种情况会更好。

如果这没有帮助,我会尝试将格式文件中的列定义更改为SQLNCHAR(虽然不确定)。

+0

我已经尝试了以上两个建议。但它不适用于他们两个! P.S. - 如果我的表具有与我的数据文件相同的列数,并且执行BULK INSERT。那么它的工作。 –