SSIS 包:在 Unicode 和非 Unicode 字符串数据类型之间进行转换

7

我正在连接到一个Oracle数据库,连接成功了,但是某些列会出现以下错误:

Description: Column "RESOURCE_NAME" cannot convert between unicode 
and non-unicode string data types.

RESOURCE_NAME的值为:

  • 对于Oracle:VARCHAR2(200 BYTE)
  • 对于SQL Server:VARCHAR(200 BYTE)

我可以通过Oracle SQL Developer连接到Oracle数据库,没有任何问题。此外,我有SSIS包设置Run64BitRuntime = False

8个回答

12

Oracle数据类型VARCHAR2在SQL Server中似乎等同于NVARCHAR,或者在SSIS中等同于DT_WSTR参考

你需要使用Data Conversion Transformation或在SQL Server中使用 CASTCONVERT 函数进行转换。


3
如果软件包在一台计算机上工作,而在另一台上不工作,则请尝试将NLS_LANG设置为正确的语言、地区和字符集,并测试该软件包。
[Command Prompt]> set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

2

最简单的方法是打开SSIS包(dtsx文件)并在记事本中进行全局查找和替换,将所有validateExternalMetadata="True"实例替换为validateExternalMetadata="False"

注意:我们在通过SSIS连接到Linux上的Oracle 11g数据库时遇到了这个问题。


我认为“.dtsx”是正确的。在修改之前,备份该文件。 - Smandoli

1

在OLEDB数据源中 ->高级编辑选项 ->输入/输出列 ->输出列 ->选择RESOURCE_NAME列并将数据类型更改为DT_WSTR,长度也可根据需要更改。


1
你可以在数据流中双击“数据转换”块,并将每个项目更改为:“Unicode字符串[DT_WSTR]”。
有效。

1

您可以在SSIS中使用SQL命令并使用CONVERTCAST。如果SSIS仍然给出错误,那是因为元数据的原因。以下是如何解决这个问题。

  1. 打开高级编辑器。
  2. 在输入和输出属性下,展开源输出。
  3. 展开输出列
  4. 选择导致问题的列。
  5. 转到数据类型属性并将数据类型更改为所需的类型DT_STR、DT_Text等。

1
这个救了我!谢谢。 - Earth Engine
我在哪里可以找到SSIS包的高级编辑器? - Patrick Schomburg
@PatrickSchomburg - 在数据流任务中,从其他来源拖动ODBC源,并右键单击该源。您将找到高级编辑器。 - shockwave
这个 - 我习惯使用的解决方案 - 对我不起作用。我将列设置为DT_WSTR(正确长度)。好的。回到高级编辑器:它又变成了DT_STR。这甚至在执行或验证之前就发生了。打开或关闭ValidateExternalMetadata都没有任何区别。我认为这是MS Oracle驱动程序在捣乱... - SebTHU

0
如果以上所有方法都失败了,可以创建一个表变量并将数据插入其中。然后选择所有记录作为源。在脚本中使用“SET NOCOUNT ON”。

0

即便我使用的是SQL Server而不是Oracle,我也遇到了非常类似的问题。在我的情况下,我正在使用平面文件作为数据源,所以我只需进入平面文件连接管理器并手动将列类型更改为Unicode字符串: enter image description here

我不知道这是否会解决您的问题,但它帮助了我 - 希望其他人也能得到帮助。 (顺便说一句,我得到了灵感,想尝试这个问题的先前答案,给予应得的赞扬)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接