导入包错误 - 无法在Unicode和非Unicode字符串数据类型之间进行转换

64 unicode types ssis sql-server-2005 non-unicode

我使用SQL Server 2008在我的计算机上创建了一个dtsx包.它将数据从分号分隔的csv文件导入到一个表中,其中所有字段类型都是NVARCHAR MAX.

它适用于我的计算机,但它需要在客户端服务器上运行.每当他们使用相同的csv文件和目标表创建相同的包时,他们就会收到上述错误.

我们已经逐步完成了包的创建,一切似乎都没问题.映射都是正确的,但是当它们在最后一步中运行包时,它们会收到此错误.他们正在使用SQL Server 2005.

任何人都可以建议从哪里开始寻找这个问题?

小智 107

从任何非unicode源转换为unicode SQL Server表的问题可以通过以下方式解决:

  • 向数据流添加数据转换转换步骤
  • 打开数据转换,并为每种适用的数据类型选择Unicode
  • 记下每个适用列的输出别名(默认情况下,它们被命名为[原始列名]的副本)
  • 现在,在Destination步骤中,单击Mappings
  • 将所有输入映射更改为来自上一步中的别名列(这是容易被忽略的步骤,并且会让您想知道为什么仍然会出现相同的错误)

  • 这个链接通过与vanlandingham解释的相同的过程... http://www.mssqltips.com/sqlservertip/1393/import-excel-unicode-data-with-sql-server-integration-services/ (4认同)
  • 纠正我,如果我错了,但没有(超过200列导入+ SSIS数据转换转换+重新映射到转换列)=保证腕管?或者有更简单的方法吗?编辑SSIS包的xml有风险还是应该没问题? (3认同)

Eri*_*ric 14

在某些时候,您正在尝试将nvarchar列转换为varchar列(反之亦然).

而且,为什么一切(据说)nvarchar(max)?如果我看过一个,这就是代码味道.您是否了解SQL Server如何存储这些列?它们使用指向实际行存储列的指针,因为它们不适合8k页面.

  • 这是一种气味,但是sql server不存储它们,除非它们适合大.超大列可能会影响某些查询计划,因为SQL可能会假设您需要所有这些大小.有关此问题,请参阅http://aboutsqlserver.com/2010/08/18/what-is-the-optimal-size-for-variable-width-columns/. (3认同)

Eve*_*ien 8

非Unicode字符串数据类型:
对文本文件使用STR,对SQL Server列使用VARCHAR.

Unicode字符串数据类型:
对文本文件使用W_STR,对SQL Server列使用NVARCHAR.

问题是您的数据类型不匹配,因此转换过程中可能会丢失数据.


小智 8

两个解决方案:1-如果目标列的类型是[nvarchar],则应该更改为[varchar]

2-将"派生列"组件添加到SSIS包并添加具有以下表达式的新列:
(DT_WSTR,«length»)[ColumnName]

Length是目标表中列的长度,ColumnName是目标表中列的名称.最后在映射部分,您应该使用这个新添加的列而不是原始列.


Chr*_*uez 7

不确定这是否是SSIS的最佳实践,但有时我发现当您想要进行此类活动时,他们的工具有点笨拙.

您可以在查询中转换数据,而不是使用它们的组件

而不是做

SELECT myField = myNvarchar20Field
FROM myTable
Run Code Online (Sandbox Code Playgroud)

你可以做到

SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable
Run Code Online (Sandbox Code Playgroud)


t_p*_*lus 5

此解决方案使用IDE进行修复:

  1. Data Conversion如下所示向您的数据流添加一个项目;

在此处输入图片说明

  1. 双击该Data Conversion项目,然后如下所示进行设置:

在此处输入图片说明

  1. 现在,双击该DB Destination项目,单击Mapping,并确保您输入的列实际上与[您的列名]的副本中的输入相同,实际上是Data Conversion输出而不是DB Source输出(请注意此处)。这是屏幕截图:

在此处输入图片说明

就是这样..保存并运行..