导入包错误 – 不能在Unicode和非Unicodestring数据types之间转换

我使用SQL Server 2008在我的计算机上创build了一个dtsx包。它将数据从分号分隔的csv文件导入到所有字段types为NVARCHAR MAX的表中。

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

我们已经逐步完成了包装的创build,一切都好了。 映射都是正确的,但是当他们在最后一步运行包时,他们会收到这个错误。 他们正在使用SQL Server 2005。

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

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

  • 将数据转换转换步骤添加到您的数据stream
  • 打开数据转换并为每个适用的数据typesselectUnicode
  • 请注意每个适用列的输出别名(默认情况下,它们被命名为Copy of [原始列名称])
  • 现在,在“目标”步骤中,单击映射
  • 改变你所有的input映射来自上一步中的别名列(这是容易被忽略的步骤,并会让你想知道为什么你仍然得到相同的错误)

在某个时候,你试图将一个nvarchar列转换成一个varchar列(反之亦然)。

此外,为什么一切(据说) nvarchar(max) ? 如果我看到一个代码,这是一种代码味道。 你知道SQL Server如何存储这些列吗? 他们使用指针指向实际行中存储列的位置,因为它们不适合8k页面。

非Unicodestring数据types:
将STR用于文本文件,将VARCHAR用于SQL Server列。

Unicodestring数据types:
使用W_STR作为文本文件,使用NVARCHAR作为SQL Server列。

问题是您的数据types不匹配,所以在转换过程中可能会丢失数据。

两种解决scheme:1-如果目标列的types是[nvarchar],则应将其更改为[varchar]

2-将“Drived Column”组件添加到SSIS包中,并使用以下expression式添加一个新列:
(DT_WSTR,“长度”)[ColumnName]

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

不知道这是SSIS的最佳做法,但有时我发现他们的工具有点笨重,当你想要做这种types的活动。

而不是使用他们的组件,你可以转换你的查询中的数据

而不是做

 SELECT myField = myNvarchar20Field FROM myTable 

你可以做

 SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field) FROM myTable 

Mike,我在SQL Server 2005中遇到了与SSIS相同的问题…显然,DataFlowDestination对象将总是试图validation进入Unicode的数据。 转到该对象,高级编辑器,组件属性窗格,将“ValidateExternalMetaData”属性更改为False。 现在,进入“input和输出属性”窗格“目的地input”,“外部列” – 设置每个列的“数据types”和“长度”以匹配将要发送到的数据库表。 现在,当你closures那个编辑器时,那些列更改将被保存并且不被validation,它将起作用。

按照下面的步骤来避免(不能在unicode和非unicodestring数据types之间转换)这个错误

i)将数据转换转换工具添加到您的DataFlow。
ii)打开DataFlow转换并select[stringDT_STR]数据types。
iii)然后去目的地stream程,select映射。
iv)将您的i / p名称更改为名称的副本。

这是一个使用IDE来解决的解决scheme:

  1. Data Conversion项添加到您的数据stream中,如下所示;

在这里输入图像说明

  1. 双击Data Conversion项目,并将其设置为如下所示:

在这里输入图像说明

  1. 现在双击DB Destination项目,点击Mapping ,并确保你的input列实际上是来自[你的列名]的副本,这实际上是Data Conversion输出不是DB Source输出(是小心点)。 这是一个截图:

在这里输入图像说明

这就是保存和运行..

获取到registry来configuration客户端并更改LANG。 对于Oracle,请转至HLM \ SOFTWARE \ ORACLE \ KEY_ORACLIENT … HOME \ NLS_LANG并更改为适当的语言。

DTS数据转换任务是时间,如果有50多列!find一个解决这个在下面的链接

 http://rdc.codeplex.com/releases/view/48420 

然而,它似乎并不适用于2008年以上的版本。所以这是我如何解决这个问题

 *Open the .DTSX file on Notepad++. Choose language as XML *Goto the <DTS:FlatFileColumns> tag. Select all items within this tag *Find the string **DTS:DataType="129"** replace with **DTS:DataType="130"** *Save the .DTSX file. *Open the project again on Visual Studio BIDS *Double Click on the Source Task . You would get the message the metadata of the following output columns does not match the metadata of the external columns with which the output columns are associated: ... Do you want to replace the metadata of the output columns with the metadata of the external columns? *Now Click Yes. We are done ! 

解决 – 给原来的问:

我以前见过这个。 最简单的方法来解决(不需要所有的数据转换步骤,所有的元数据都可以从源连接获得):

删除OLE DB源和OLE DB目标请确保延迟validation是FALSE(稍后可以将其设置为True)使用查询等重新创buildOLE DB源在高级编辑器中validation所有输出数据列types是否正确重新创build您的OLE DB目标,映射,创build新表(或重新映射到现有),您将看到SSIS获得了所有数据types正确(与源相同)。

上面的东西要容易得多。

不知道这是否仍然是一个问题,但我发现这个简单的解决scheme:

  1. 右键单击Ole数据库源
  2. select“编辑”
  3. selectinput和输出属性选项卡
  4. 在“input和输出”下,展开“Ole DB源输出”外部列和输出列
  5. 在“输出”列中,select违规字段,在右侧面板上确保数据types属性与“外部列”属性中的字段匹配

希望这是明确的,容易遵循

有时我们在源查询/视图/过程中select静态字符作为字段,而在Unicode中select目标字段数据types时,会出现此错误。

以下是我遇到的问题: 我在源代码中使用了以下脚本

并得到错误消息Column "CATEGORY" cannot convert between Unicode and non-Unicode string data types. 如下所示: 错误消息

解决方法:我尝试了多个选项,但都没有为我工作。 然后我用N作为前缀的静态值,如下所示:

 SELECT N'STUDENT DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM STUDENTS UNION SELECT N'FACULTY DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM FACULTY 

如果有人仍然遇到这个问题,我发现它涉及到Oracle客户端版本的差异。

我已经发布了我的全部经验和解决scheme在这里: https : //stackoverflow.com/a/43806765/923177

 1.add a Data Conversion tool from toolbox 2.Open it,It shows all coloumns from excel ,convert it to desire output. take note of the Output Alias of each applicable column (they are named Copy Of [original column name] by default) 3.now, in the Destination step, click on Mappings 

我为每个转换任务更改了ValidateExternalMetadata = False。 它为我工作。