79

我有一个 ssis 包,我在其中使用链接到 SQL Server 2005 表的 OLEDB 源。除日期列之外的所有列都是 NVARCHAR(255)。我正在使用 Excel 目标并使用 SQL 语句在 Excel 工作簿中创建工作表,SQL 位于 excel 连接管理器中(实际上是创建工作表的 create table 语句),并且源自从D B。

无论我做了什么,我都会不断收到这个 unicode --> 我的源和目标之间的非 unicode 转换错误。尝试在 S > D 之间转换为字符串 [DT_STR],将其删除,将 SQL 表 VARCHAR 更改为 NVARCHAR,但仍然出现此翻转错误。

因为我正在使用 SQL 语句在 Excel 中创建工作表,所以我看不到任何方法来实际预定义 Excel 工作表中列的数据类型。我想这将是一个默认的元数据,但我不知道。

那么在我的 SQL 表目标和使用这个 SSIS sql 语句创建我的 Excel 工作表之间,我怎样才能阻止这个错误的出现呢?

我的错误是:

数据流任务 [OLE DB 源 [1]] 出错:列“MyColumn”无法在 unicode 和非 unicode 字符串数据类型之间转换。

对于所有 nvarchar 列。

感谢任何帮助

谢谢

安德鲁

4

12 回答 12

88

以下步骤对我有用:

  1. 右键单击源任务。

  2. 单击“显示高级编辑器”。

ssis 中源任务的高级编辑选项

  1. 转到“输入和输出属性”选项卡。

  1. 选择您收到错误的输出列。

  2. 它的数据类型将是“String[DT_STR]”。

  3. 将该数据类型更改为“Unicode String[DT_WSTR]”。

将数据类型更改为 unicode 字符串

  1. 保存并关闭。

希望这可以帮助!

于 2016-12-13T10:09:25.193 回答
64

添加数据转换转换以将字符串列从非 Unicode (DT_STR) 转换为 Unicode (DT_WSTR) 字符串。

您需要对所有字符串列执行此操作...

于 2014-03-25T11:49:19.360 回答
23

这里缺少的部分是Data Conversion对象。它应该在 OLE DB Source 和 Destination 对象之间。

在此处输入图像描述

于 2018-03-02T23:38:51.697 回答
17
  1. 首先,将数据转换块添加到数据流图中。

  2. 打开数据转换块并勾选显示错误的列。下面将其数据类型更改为 unicode string(DT_WSTR) 或任何预期的数据类型并保存。

  3. 转到目标块。去里面映射,把新创建的元素映射到对应的地址,保存。

  4. 在解决方案资源管理器中右键单击您的项目。选择属性。选择配置属性并在其中选择调试。在此,将 Run64BitRunTime 选项设置为 false(因为 excel 不能很好地处理 64 位应用程序)。

于 2015-06-11T05:41:36.377 回答
9

您可以将 nvarchar 列转换为 varchar 列,而不是添加之前建议的数据转换。这可以防止您执行不必要的步骤,并且具有比替代方案更高的性能。

在您的 SQL 语句的选择中,替换dateCAST(date AS varchar([size])). 由于某种原因,这还没有改变输出数据类型。为此,请执行以下操作:

  1. 右键单击您的OLE DB 源步骤并打开高级编辑器。
  2. 转到输入和输出属性
  3. 选择输出列
  4. 选择您的专栏
  5. 在数据类型属性下将数据类型更改为字符串 [DT_STR]
  6. 将 Length 更改为您在CAST语句中指定的长度

完成此操作后,您的源数据将作为 varchar 输出,您的错误将消失。

资源

于 2017-11-08T13:38:47.687 回答
3

我一直有同样的问题,并尝试了这里写的所有东西,但它仍然给了我同样的错误。结果是我试图转换的列中的 NULL 值。

删除 NULL 值解决了我的问题。

干杯,艾哈迈德

于 2017-07-31T20:57:26.537 回答
3

在上面的示例中,我一直丢失值,我认为延迟验证将允许将新数据类型保存为元数据的一部分。

在“Excel 连接管理器”的连接管理器上,从属性中将延迟验证设置为 False。

然后在 Excel 的数据流目标任务上,再次从属性中将 ValidationExternalMetaData 设置为 False。

现在,这将允许您右键单击 Excel 目标任务并转到 Excel 目标的高级编辑器 - > 最右侧选项卡 - 输入和输出属性。在 External Columns 文件夹部分,您现在可以更改有问题的列的数据类型和长度值,现在可以保存。

祝你好运!

于 2017-01-19T13:52:27.037 回答
3

似乎没有人提到这一点,但是在源查询中将 varchar 转换为 nvarchar 也解决了这个问题。

于 2021-03-16T16:28:30.190 回答
3

当我安装连接到在 Windows 上运行的 Oracle 12 服务器的 Oracle 版本 12 客户端 32 位客户端时,我遇到了这种情况。尽管 Oracle-source 和 SqlServer-destination 都不是 Unicode,但我一直收到此消息,好像 oracle 列是 Unicode。我解决了插入数据转换框的问题,并为 varchar2 字段选择类型 DT-STR(非 unicode),为数字字段选择类型 DT-WSTR(unicode),然后我从输出字段名称中删除了“COPY OF”。请注意,我一直收到错误,因为我在设置转换类型之前已将源框箭头与转换框连接起来。所以我不得不切换源框,这清除了目标框中的所有错误。

于 2017-10-09T10:05:08.297 回答
1

在 SQL Server 中创建表时,使您的表列NVARCHAR而不是VARCHAR.

于 2021-02-06T03:25:16.620 回答
1

我认为人们错过了这一点。在我的例子中,我有 100 个字符列可以在 Oracle 和 MS Sql 之间进行转换。如果您有 100 个单独的字符列要分配,那么所有关于数据转换和高级编辑器的东西都非常乏味。再加上 SSIS 是 SSIS,即使您将 VALIDATEEXTERNALMETADATA 设置为 false,它有时也会重置所有 100 个高级编辑器更改,这非常令人讨厌。如果有一些价值,我不介意进行数据转换,但是 20 年前 ETL 工具用来将 oracle 字符转换为 ms sql 字符而不大惊小怪。如果您有很多字符列并且可以使用 nvarchar,那么 Bakalolo 和 Zafer 说的就是答案,只需声明所有输出 ms sql 列(nvarchar),您的数据任务就会自动将您的 oracle 字段分配到 ms sql 字段中,没有手动覆盖。我还发现新的 Oracle Source (2021) 不会抱怨在 ms sql 中将 unicode 转换为 varchar。一位同事刚刚告诉我,将 oracle 字符分配给 ms sql varchar 的 ssis 向导(可能仅在 vs 2019+ 中)将自动执行分配而不会覆盖,但我个人没有尝试过。

于 2021-06-17T22:47:37.360 回答
0

我刚刚遇到同样的问题,我在我的 SQL 请求中解决了它:直接使用 convert

CONVERT(NVARCHAR(50),'') AS MyVarName

我需要将一个空的(或固定大小的字符串)放入 excel 文件中。将 MyVarName 的强制类型从 DT-STR 转换为 DT-WSTR (unicode)

于 2022-02-01T14:32:58.033 回答