由于代码页不正确,无法导入字符

Can't import characters due to incorrect code page

我有一个 SSIS 作业可以将平面文件中的数据导入 SQL 服务器 table。我遇到有关源文件和目标 table 编码的问题。 该文件是一个 UTF8 编码的 CSV 文件,带有一些标准的重音拉丁字符(ãóé 等)。我的目的地 table 被定义为具有 Latin1_General_CI_AS 排序规则,这意味着我可以毫无问题地手动插入以下文本:“JOãO ANTÓNIO”。

当我声明平面文件源时,它会自动将文件确定为具有 65001 代码页 (UTF-8),并推断出 字符串 [DT_STR] 每列的数据类型。但是,SSIS 包自动假定目标 table 具有 1252 代码页,给我以下错误:

Validation error. <STEPNAME>: <STEPNAME>: The code page 65002 specified on output column "<MYCOLUMN>" (180) is not valid. Select a different code page for output column "<MYCOLUMN>". 

我明白为什么,因为数据库排序规则被定义为具有该代码页。但是,如果我尝试将平面文件数据源设置为具有 Latin1 1252 编码,SSIS 会执行但它会错误地导入字符:

JOÃO ANTÓNIO(平面文件)-> JOAO ANTÓNIO(数据库)。

我已经尝试将平面文件源配置为与 unicode 兼容,但是当我将每一列配置为具有与 unicode 兼容的数据类型后,我无法更新目标步骤,因为 SSIS 直接推断数据类型来自数据库,不允许我更改它们。

有没有办法让平面文件源保持为 CP 1252,同时导入正确的字符?我在这里错过了什么?

感谢 Larnu 的评论,我已经能够解决这个问题。

由于SSIS不允许隐式数据转换,我需要先设置一个数据转换步骤(Derived Column Transformation)。由于源列已经设置为 DTSTR[65002],我必须配置新的派生列形成一个表达式,从源代码页转换为目标代码页,表达式如下:

(DT_STR, 50, 1252)<SourceColumn>

在直接转换为 DT_STR 的情况下,说明列的最大大小为 50 个字符,数据将使用 1252 代码页表示。