我正在开发一个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数据源将源中的字符串列公开为单字节?
LocaleID =英语(英国)
SELECT * FROM V$SESSION_CONNECT_INFO
SELECT * FROM SYS.NLS_DATABASE_PARAMETERS
答案 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/