问题描述
我有一个 SSIS 作业将数据从平面文件导入 sql Server 表。我在源文件和目标表的编码方面遇到问题。 该文件是一个 UTF8 编码的 CSV 文件,带有一些标准的带重音的拉丁字符(ãóé 等)。我的目标表被定义为具有 latin1_General_CI_AS 排序规则,这意味着我可以毫无问题地手动插入以下文本:“JOÃO ANTÓNIO”。
当我声明平面文件源时,它会自动确定该文件具有 65001 代码页 (UTF-8),并为每一列推断字符串 [DT_STR] 数据类型。但是,SSIS 包自动假定目标表具有 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 不允许隐式数据转换,我需要先设置一个数据转换步骤(派生列转换)。由于源列已经设置为 DTSTR[65002],我不得不配置新的派生列形成一个表达式,从源代码页转换为目标代码页,使用以下表达式:
(DT_STR,50,1252)<SourceColumn>
在直接转换为 DT_STR 的情况下,声明该列的最大长度为 50 个字符,并且数据将使用 1252 代码页表示。