首页 文章

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

提问于
浏览
63

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

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

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

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

16 回答

  • 1

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

    • 向数据流添加数据转换转换步骤

    • 打开数据转换,并为每种适用的数据类型选择Unicode

    • 记下每个适用列的输出别名(默认情况下,它们被命名为[原始列名]的副本)

    • 现在,在“目标”步骤中,单击“映射”

    • 将所有输入映射更改为来自上一步骤中的别名列(这是容易被忽略的步骤,并且会让您想知道为什么仍然会出现相同的错误)

  • 0

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

    而且,为什么一切(据说) nvarchar(max) ?那个_913387_适合8k页 .

  • -2

    Non-Unicode string data types:
    将STR用于文本文件,将VARCHAR用于SQL Server列 .

    Unicode string data types:
    将W_STR用于文本文件,将NVARCHAR用于SQL Server列 .

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

  • 106

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

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

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

  • 1

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

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

    而不是做

    SELECT myField = myNvarchar20Field
    FROM myTable
    

    你可以做到

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

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

  • 7

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

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

  • 8

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

    • 在数据流中添加 Data Conversion 项,如下所示;

    enter image description here

    • 双击 Data Conversion 项目,并如下所示进行设置:

    enter image description here

    • 现在双击 DB Destination 项目,单击 Mapping ,并确保 input Column 实际上与来自[您的列名]的副本相同,实际上是 Data Conversion 输出而不是 DB Source 输出(这里要小心) . 这是一个截图:

    enter image description here

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

  • -1

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

  • 0

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

    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 !
    
  • 4

    已解决 - 原来问:

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

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

    上面的东西要容易得多 .

  • 1

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

    • 右键单击Ole DB Source

    • 选择'Edit'

    • 选择输入和输出属性选项卡

    • 在"Inputs and Outputs"下,展开"Ole DB Source Output"外部列和输出列

    • 在“输出”列中,选择有问题的字段,在右侧面板上确保“数据类型属性”与“外部列”属性中的字段匹配

    希望这很清楚,也很容易理解

  • 4

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

    Below is the issue i faced: I used the script below at source

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

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

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

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

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

  • 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
    
  • 13

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

相关问题