当Oracle Database中的单字节时,SSIS数据源将字符串列显示为DT_WSTR

时间:2016-05-17 14:29:24

标签: oracle11g ssis bids

我正在开发一个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({8}的8 Windows equivalent)。
  • 重新安装了Oracle客户端。

约束

  • 我正在传输2M +行,并且程序包执行的持续时间是个问题。理想情况下,我不想添加Unicode>非Unicode数据转换转换为可能对性能产生负面影响的数据流。
  • 我无法控制Oracle服务器/数据库配置。

环境配置

Windows客户端

  • Windows 7 Pro
  • BIDS / 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(使用Full Instant Client从SSIS调用查询时)
  • CLIENT_CHARSET =未知(使用jdbcthin从SQL Developer调用查询时)

Oracle Server

SELECT * FROM SYS.NLS_DATABASE_PARAMETERS
  • NLS_LANGUAGE = ENGLISH
  • NLS_TERRITORY =英国
  • NLS_CHARACTERSET = WE8ISO8859P1

2 个答案:

答案 0 :(得分:1)

正如您已经注意到的,当客户端的字符集不是数据库的超集时,Oracle客户端使用“unicode mode”。数据库的字符集绝对是WE8ISO8859P1。您客户的字符集尚未确定。客户端会话连接信息不是可靠的来源。

环境变量NLS_LANG会覆盖注册表设置(如果有)。要确保OraOLEDB客户端使用所需的NLS_LANG值,请确保执行SSIS包的用户具有该环境变量集。你可以意识到这一点,通过编辑HKEY_USERS\<that user's id>\Environment\NLS_LANG。我建议首先使它等于数据库WE8ISO8859P1,以排除Oracle客户端不将WE8MSWIN1252视为超集。

关于this的优秀文章。

答案 1 :(得分:0)

使用高级编辑器(右键单击组件将其显示为选项),您可以手动设置列的输出类型。请参阅以下文章:

http://www.sqlservergeeks.com/sql-server-data-type-conversion-options-in-ssis/