我使用SQL Server 2008在我的计算机上创建了一个dtsx包 . 它将数据从分号分隔的csv文件导入到一个表中,其中所有字段类型都是NVARCHAR MAX .
它适用于我的计算机,但它需要在客户端服务器上运行 . 每当他们使用相同的csv文件和目标表创建相同的包时,他们就会收到上述错误 .
我们已经逐步完成了包的创建,一切似乎都没问题 . 映射都是正确的,但是当它们在最后一步中运行包时,它们会收到此错误 . 他们正在使用SQL Server 2005 .
任何人都可以建议从哪里开始寻找这个问题?
16 回答
从任何非unicode源转换为unicode SQL Server表的问题可以通过以下方式解决:
向数据流添加数据转换转换步骤
打开数据转换,并为每种适用的数据类型选择Unicode
记下每个适用列的输出别名(默认情况下,它们被命名为[原始列名]的副本)
现在,在“目标”步骤中,单击“映射”
将所有输入映射更改为来自上一步骤中的别名列(这是容易被忽略的步骤,并且会让您想知道为什么仍然会出现相同的错误)
在某些时候,您正在尝试将
nvarchar
列转换为varchar
列(反之亦然) .而且,为什么一切(据说)
nvarchar(max)
?那个_913387_适合8k页 .Non-Unicode string data types:
将STR用于文本文件,将VARCHAR用于SQL Server列 .
Unicode string data types:
将W_STR用于文本文件,将NVARCHAR用于SQL Server列 .
问题是您的数据类型不匹配,因此转换过程中可能会丢失数据 .
两个解决方案:1-如果目标列的类型是[nvarchar],则应该更改为[varchar]
2-将"Derived Column"组件添加到SSIS包并添加具有以下表达式的新列:
(DT_WSTR,«长度»)[ColumnName]
Length是目标表中列的长度,ColumnName是目标表中列的名称 . 最后在映射部分,您应该使用这个新添加的列而不是原始列 .
不确定这是否是SSIS的最佳实践,但有时我发现当您想要进行此类活动时,他们的工具有点笨拙 .
您可以在查询中转换数据,而不是使用它们的组件
而不是做
你可以做到
Mike,我在SQL Server 2005中遇到了与SSIS相同的问题......显然,DataFlowDestination对象总是会尝试验证进入Unicode的数据 . 转到该对象,“高级编辑器”,“组件属性”窗格,将“ValidateExternalMetaData”属性更改为False . 现在,转到“输入和输出属性”窗格,“目标输入”,“外部列” - 设置每个列的“数据类型”和“长度”以匹配它将要访问的数据库表 . 现在,当您关闭该编辑器时,这些列更改将被保存并且未经过验证,它将起作用 .
按照以下步骤避免(无法在unicode和非unicode字符串数据类型之间进行转换)此错误
i)将数据转换转换工具添加到DataFlow .
ii)打开DataFlow Conversion并选择[string DT_STR]数据类型 .
iii)然后转到目标流,选择映射 .
iv)将您的i / p名称更改为名称的副本 .
这是一个使用IDE修复的解决方案:
Data Conversion
项,如下所示;Data Conversion
项目,并如下所示进行设置:DB Destination
项目,单击Mapping
,并确保 input Column 实际上与来自[您的列名]的副本相同,实际上是Data Conversion
输出而不是DB Source
输出(这里要小心) . 这是一个截图:这就是它..保存并运行..
到达注册表以配置客户端并更改LANG . 对于Oracle,请转至HLM \ SOFTWARE \ ORACLE \ KEY_ORACLIENT ... HOME \ NLS_LANG并更改为适当的语言 .
如果有50个以上的列,则dts数据转换任务需要时间!在下面的链接中找到了解决方法
但是,它似乎不适用于2008年以上的版本 . 所以这就是我必须的解决问题
已解决 - 原来问:
我以前见过这个 . 最简单的修复方法(不需要所有这些数据转换步骤,因为所有元数据都可以从源连接获得):
删除OLE DB源和OLE DB目标确保延迟验证为FALSE(您可以稍后将其设置为True)使用您的查询等重新创建OLE DB源 . 在高级编辑器中验证所有输出数据列类型是否正确重新创建OLE DB目标,映射,创建新表(或重新映射到现有),您将看到SSIS正确获取所有数据类型(与源相同) .
上面的东西要容易得多 .
不确定这是否仍然是一个问题,但我找到了这个简单的解决方案:
右键单击Ole DB Source
选择'Edit'
选择输入和输出属性选项卡
在"Inputs and Outputs"下,展开"Ole DB Source Output"外部列和输出列
在“输出”列中,选择有问题的字段,在右侧面板上确保“数据类型属性”与“外部列”属性中的字段匹配
希望这很清楚,也很容易理解
有时我们在源查询/视图/过程中选择静态字符作为字段,在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 messageResolution: 我尝试了多种选择,但没有一种适合我 . 然后我用静态值和N作为前缀来制作Unicode,如下所示:
如果有人仍然遇到此问题,我发现它与Oracle客户端版本的差异有关 .
我在这里发布了我的完整经验和解决方案:https://stackoverflow.com/a/43806765/923177
我为每个转换任务更改了ValidateExternalMetadata = False . 它对我有用 .