我一直在使用SQL Server 2008中它从一个分号分隔的CSV文件导入数据到表中,所有的字段类型是NVARCHAR MAX使我的计算机上的DTSX包。
它的工作原理我的电脑上,但它需要在客户端服务器上运行。 每当他们创建相同的包具有相同的csv文件和目标表,他们收到上述错误。
我们通过建立一步封装步骤走了,一切似乎都OK。 该映射是正确的,但是当他们跑在最后一步的包,他们收到此错误。 他们使用SQL Server 2005。
任何人都可以建议从何处开始寻找这个问题的?
我一直在使用SQL Server 2008中它从一个分号分隔的CSV文件导入数据到表中,所有的字段类型是NVARCHAR MAX使我的计算机上的DTSX包。
它的工作原理我的电脑上,但它需要在客户端服务器上运行。 每当他们创建相同的包具有相同的csv文件和目标表,他们收到上述错误。
我们通过建立一步封装步骤走了,一切似乎都OK。 该映射是正确的,但是当他们跑在最后一步的包,他们收到此错误。 他们使用SQL Server 2005。
任何人都可以建议从何处开始寻找这个问题的?
从任何非Unicode源转化成Unicode的SQL Server表的问题可以通过解决:
在某些时候,你想一个转换nvarchar
列的varchar
列(或反之亦然)。
此外,为什么一切(据说) nvarchar(max)
? 这是一个代码味道,如果我见过一个。 你知不知道SQL Server如何存储这些列? 他们用在何处列从实际的行存储,因为它们没有在8K页面内适应。
非Unicode字符串数据类型:
使用STR文本文件和VARCHAR的SQL Server列。
Unicode字符串数据类型:
使用W_STR为文本文件,并NVARCHAR为SQL Server列。
问题是,你的数据类型不匹配,所以有可能是在转换过程中的数据丢失。
两个解决方案:1-如果目标列的类型为[nvarchar的应当改变为[VARCHAR]
2-一个“派生列”组件添加到SSIS包,并用下面的表达式添加新的列中:
(DT_WSTR,«长度»)的ColumnName]
长度是在所述目标表中的列的长度和的ColumnName是在目标表中的列的名称。 最后在映射的一部分,你应该使用这个新添加的列代替了原来的列。
不知道这是SSIS最佳实践,但有时我发现,当你想要做这种类型的活动,他们的工具是有点笨重。
除了使用它们的组件,你可以查询中转换数据
而不是做
SELECT myField = myNvarchar20Field
FROM myTable
你可以这样做
SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable
这是使用IDE来修复解决方案:
Data Conversion
项目到您的数据流,如下图所示;
Data Conversion
项目,并将其设置,如下所示:
DB Destination
项,单击Mapping
,并确保您的输入列实际上是一样的,从[您的列名]的副本,这实际上是在即将到来的Data Conversion
输出NOT的DB Source
输出(可小心这里)。 下面是截图:
并且那它..保存并运行..
迈克,我有SSIS有同样的问题在SQL Server 2005 ...显然,DataFlowDestination对象总是会尝试验证数据进来,为Unicode。 转到该对象,高级编辑器,组件属性窗格中的“ValidateExternalMetaData”属性更改为false。 现在,到了输入和输出属性窗格中,目的地输入,外部列 - 设置每列数据类型和长度,以配合这将数据库表。 现在,当您关闭编辑器,这些列中的更改将被保存,而不是验证过,它会工作。
按照下面的步骤,以避免(不能Unicode和非Unicode字符串数据类型之间转换)这个错误
I)数据转换变换工具添加到您的数据流。
ⅱ)要打开的数据流转换和选择[字符串DT_STR]数据类型。
三)然后去目的地流动,选择Mapping。
四)改变你的I / P名的名称进行复制。
获取到注册表配置的客户端,并改变LANG。 对于Oracle,去HLM \ SOFTWARE \ ORACLE \ KEY_ORACLIENT ...首页\ NLS_LANG并切换到合适的语言。
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 !
解决了 - 原来的问:
我以前见过这个。 修复(并不需要所有这些数据转换步骤,因为所有的元数据可以从源连接),最简单的方法:
删除OLE DB源和OLE DB目的地确认延迟确认为FALSE(以后可以将其设置为true)与您的查询重新创建OLE DB源等验证的高级编辑器,所有的输出数据列类型是正确的重新创建OLE DB目的地,地图,创建新表(或重新映射到现有的),你会看到SSIS得到正确的数据类型(同源)。
这么容易,上面的东西。
不知道这仍然是一个问题,但我发现这个简单的解决方案:
希望这是清晰和易于理解
有时,当我们选择静态字符作为源查询/视图/过程的领域和Unicode的目标字段的数据类型,我们得到这个错误。
下面是我所面临的问题: 我用下面的脚本在源头
并得到了错误信息Column "CATEGORY" cannot convert between Unicode and non-Unicode string data types.
如下: 错误消息
分辨率:我试过多种选择,但没有为我工作。 然后,我前缀有N静态值以Unicode进行如下:
SELECT N'STUDENT DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM STUDENTS
UNION
SELECT N'FACULTY DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM FACULTY
如果有人仍然遇到这个问题,我发现,它关系到Oracle客户端版本的差异。
我已经张贴了我充分的经验和解决方案在这里: 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的每个改造任务。 它为我工作。