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

时间:2009-08-19 12:22:04

标签: sql-server-2005 unicode ssis types non-unicode

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

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

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

有人可以建议从哪里开始寻找这个问题吗?

16 个答案:

答案 0 :(得分:107)

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

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

答案 1 :(得分:14)

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

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

答案 2 :(得分:8)

非Unicode字符串数据类型:
将STR用于文本文件,将VARCHAR用于SQL Server列。

Unicode字符串数据类型:
将W_STR用于文本文件,将NVARCHAR用于SQL Server列。

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

答案 3 :(得分:8)

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

2-将“派生列”组件添加到SSIS包中,并使用以下表达式添加新列:
(DT_WSTR,«长度»)[ColumnName]

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

答案 4 :(得分:7)

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

您可以转换查询中的数据

,而不是使用他们的组件

而不是做

SELECT myField = myNvarchar20Field
FROM myTable

你可以做到

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

答案 5 :(得分:5)

这是一个使用IDE修复的解决方案:

  1. 在数据流中添加Data Conversion项,如下所示;
  2. enter image description here

    1. 双击Data Conversion项,然后按如下所示进行设置:
    2. enter image description here

      1. 现在双击DB Destination项,点击Mapping,确保输入列实际上与来自[您的列名]的副本相同],实际上是Data Conversion输出而不是DB Source输出(这里要小心)。这是一个截图:
      2. enter image description here

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

答案 6 :(得分:4)

迈克,我在SQL Server 2005中遇到了与SSIS相同的问题...... 显然,DataFlowDestination对象将始终尝试验证进入的数据, 到Unicode。转到该对象,“高级编辑器”,“组件属性”窗格,将“ValidateExternalMetaData”属性更改为False。现在,转到“输入和输出属性”窗格,“目标输入”,“外部列” - 设置每个列的“数据类型”和“长度”以匹配它将要访问的数据库表。现在,当您关闭该编辑器时,这些列更改将被保存并且未经过验证,它将起作用。

答案 7 :(得分:4)

按照以下步骤避免(无法在unicode和非unicode字符串数据类型之间进行转换)此错误

i)将数据转换转换工具添加到DataFlow中 ii)打开DataFlow Conversion并选择[string DT_STR]数据类型 iii)然后转到目标流,选择映射 iv)将您的i / p名称更改为名称的副本。

答案 8 :(得分:1)

访问注册表以配置客户端并更改LANG。 对于Oracle,请转至HLM \ SOFTWARE \ ORACLE \ KEY_ORACLIENT ... HOME \ NLS_LANG并更改为适当的语言。

答案 9 :(得分:1)

dts数据转换任务是时间,如果有50个以上的列!在下面的链接找到了解决方法

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 !

答案 10 :(得分:1)

已解决 - 原来问:

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

删除OLE DB源&amp; OLE DB目标 确保延迟验证为FALSE(您可以稍后将其设置为True) 使用您的查询等重新创建OLE DB源。 在高级编辑器中验证所有输出数据列类型是否正确 重新创建OLE DB目标,映射,创建新表(或重新映射到现有表),您将看到SSIS正确获取所有数据类型(与源相同)。

上面的内容要容易得多。

答案 11 :(得分:1)

不确定这是否仍然存在问题,但我找到了这个简单的解决方案:

  1. 右键单击Ole DB Source
  2. 选择“修改”
  3. 选择输入和输出属性选项卡
  4. 在“输入和输出”下,展开“Ole DB源输出”外部列和输出列
  5. 在“输出”列中,选择有问题的字段,在右侧面板上确保“数据类型属性”与“外部列”属性中的字段匹配
  6. 希望这很清楚,也很容易理解

答案 12 :(得分:0)

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

以下是我面临的问题: I used the script below at source

并收到如下错误消息Column "CATEGORY" cannot convert between Unicode and non-Unicode string data types.error message

解决: 我尝试了多种选择,但没有一种适合我。然后我用静态值和N作为前缀来制作Unicode,如下所示:

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

答案 13 :(得分:0)

如果有人仍然遇到此问题,我发现它与Oracle客户端版本的差异有关。

我已在此处发布了我的完整经验和解决方案:https://stackoverflow.com/a/43806765/923177

答案 14 :(得分:-1)

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

答案 15 :(得分:-2)

我为每个转换任务更改了ValidateExternalMetadata = False。它对我有用。