【发布时间】:2016-05-17 14:29:24
【问题描述】:
我正在开发一个 SSIS 包,用于从 Oracle 11g 数据库中的表中提取数据并将其加载到 SQL Server 2014 数据库中的表中。
Oracle 数据库中的表具有定义为 VARCHAR2 的字符串列(单字节/代码页 8859-1); SQL Server 数据库中的表具有定义为 VARCHAR(单字节)的字符串列。
但是,当我将 OLE DB 源/ADO .NET 源添加到 SSIS 包并将其配置为从 Oracle 源中的表中选择列时,外部列(高级编辑器)将字符串列显示为 DT_WSTR(Unicode )。
Oracle article(请参阅“Oracle Unicode 支持如何工作”部分)建议“当客户端字符集不是服务器字符集的超集或数据库字符集是多字节字符集时,OraOLEDB 会自动启用Unicode 模式。”
如何让 OraOLEDB 提供程序/SSIS OLE DB 数据源将源中的字符串列公开为单字节?
我尝试过的
- 将(OLE DB 源的)AlwaysUseDefaultCodePage 属性设置为 true,并将 DefaultCodePage 属性设置为 1252(8859-1 是此属性的子集)。
- 将(OLE DB 源的)AlwaysUseDefaultCodePage 属性设置为 true,并将 DefaultCodePage 属性设置为 28591(8859-1 的 Windows equivalent)。
- 重新安装了 Oracle 客户端。
约束
- 我正在传输 2M+ 行,并且包执行所需的持续时间是一个问题。理想情况下,我不想向可能对性能产生负面影响的数据流添加 Unicode > 非 Unicode 数据转换转换。
- 我无法控制 Oracle 服务器/数据库配置。
环境配置
Windows 客户端
- Windows 7 专业版
- 投标/Visual Studio 2013
- Oracle 客户端 11g 修订版 5(仅限 32 位 - 未安装 64 位客户端)
- Oracle NLS_LANG = ENGLISH_UNITED KINGDOM.WE8MSWIN1252(在 Wow6432Node 注册表中设置 - 没有覆盖环境变量)
SSIS 包/数据流任务/OLE DB 数据源
LocaleID = 英语(英国)
客户端会话连接信息
SELECT * FROM V$SESSION_CONNECT_INFO
- CLIENT_CHARSET = UTF8(当使用完整即时客户端从 SSIS 调用查询时)
- CLIENT_CHARSET = 未知(当使用 jdbcthin 从 SQL Developer 调用查询时)
Oracle 服务器
SELECT * FROM SYS.NLS_DATABASE_PARAMETERS
- NLS_LANGUAGE = 英语
- NLS_TERRITORY = 英国
- NLS_CHARACTERSET = WE8ISO8859P1
【问题讨论】:
-
OLEDB Source的高级编辑器中的输出列的数据类型不能改一下吗?