SSIS 在 Unicode 和非 Unicode 错误之间转换

Posted

技术标签:

【中文标题】SSIS 在 Unicode 和非 Unicode 错误之间转换【英文标题】:SSIS Convert Between Unicode and Non-Unicode Error 【发布时间】:2013-03-10 23:07:37 【问题描述】:

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

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

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

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

我的错误是:

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

对于所有 nvarchar 列。

感谢任何帮助

谢谢

安德鲁

【问题讨论】:

你需要使用Data Conversionnon-unicode转换为unicode,因为excel只识别unicode数据 删除了SSIS包的转换部分,删除了destination和excel的连接,包括删除了工作簿中SQL创建的sheet,重新开始。现在它加载正常,错误 正如我所说,现在删除转换工作正常。据我了解,SQL 数据列类型是 NVARCHAR 一种 unicode 类型,因此不需要转换。 是的,我的错误。只是没有考虑到您在源代码中有NVARCHAR,但我所说的是正确的,excel 只识别unicode 数据 删除 OLE DB 源并重新创建它。为我工作。 【参考方案1】:

以下步骤对我有用:

    右键单击源任务。

    点击“显示高级编辑器”。

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

    选择您遇到错误的输出列。

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

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

    保存并关闭。

希望这会有所帮助!

【讨论】:

@asmgx 尝试更改输入/输出文件连接以使用 Unicode(复选框) @asmgx 实际上,对我来说,解决方案是进入 source 文件的高级编辑器,并更改列定义,而不是在目标表上。 我试过了,但现在我在源代码编辑器(sql server)中遇到了同样的转换错误【参考方案2】:

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

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

【讨论】:

有效,但答案应附有“腕管”警告/免责声明。 在这种情况下 Biml 会很方便@pokerplayer23 我在带有 ms sql 输入和 excel 输出的 vs 2017 ent 中收到此错误。他们说人工智能将夺走我们所有的工作。对于那些没有做过 etl long 的人来说,将字符字段从源复制到目标曾经是很容易的部分。这就是微软对微软。我们距离任何智能都还有很长的路要走,更不用说人工智能了。【参考方案3】:

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

【讨论】:

【参考方案4】:

    首先,将数据转换块添加到数据流图中。

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

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

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

【讨论】:

【参考方案5】:

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

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

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

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

Source

【讨论】:

这是个好主意,我试过了,但它仍然显示转换错误(请注意,OLE DB 源中的预览查询显示正确的结果),但它显示红色“X " 并且程序包不会运行。转换发生从 varchar(x) 到 nvarchar(x)。 尝试将 Pubs (Employee) 中的 (fname, lname, emp_id) 加载到 Northwind (Employee) 数据库中。两者都有 SQL_Latin1_General_CP1_CI_AS 排序规则,都是为 SQL 2016 设置的。 在高级编辑器中修改数据类型导致“属性值无效”错误【参考方案6】:

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

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

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

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

祝你好运!

【讨论】:

【参考方案7】:

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

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

干杯, 艾哈迈德

【讨论】:

你在 ssis 中对 null 做了什么来修复它?是否需要进行其他数据转换?我无法删除我要输入数据库的电子表格中的空值/空白。【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

Zafer,我很确定我发现 Oracle 转换为 nvarchar2 对我不起作用。我必须声明 ms sql 输出列 nvarchar 不必进行数据转换。【参考方案10】:

在 SQL Server 中创建表时,将表列设为 NVARCHAR 而不是 VARCHAR

【讨论】:

【参考方案11】:

我认为人们错过了这一点。就我而言,我有 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+ 中)将自动执行分配而不会覆盖,但我个人没有尝试过。

【讨论】:

以上是关于SSIS 在 Unicode 和非 Unicode 错误之间转换的主要内容,如果未能解决你的问题,请参考以下文章

SSIS在Unicode和非Unicode错误之间转换

SSIS包写入CRM 2011数据类型错误

在SQL数据类型中,Unicode数据类型和非Unicode数据类型具体有啥区别?

组件的 SSIS 包外部列不同步

SQL 中 unicode字符和非unicode字符的区别

Unicode字符串和非Unicode字符串