批量插入utf-8与utf-16编码数据

时间:2016-09-12 20:05:10

标签: sql-server utf-8 bulkinsert utf-16

我的SQL Server中有一个包含以下列的表

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
  第2行第1列(sub_brand_id)的批量加载数据转换错误(类型不匹配或指定代码页的无效字符)。

我的批量插入查询如下所示:

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

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

任何人都可以提供理由和解决方案吗?

1 个答案:

答案 0 :(得分:0)

离开头顶,有几点建议:

您可以将datafiletype = 'widechar'添加到WITH语句的bulk insert子句中。但是,这可能很棘手,因为SQL Server行为可能会有所不同,具体取决于数据文件是否包含BOM。最好测试两种情况。

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