我使用SQL Server 2008在我的计算机上创建了一个dtsx包。它将分号分隔的csv文件中的数据导入到一个表中,其中所有字段类型都是NVARCHAR MAX。
它适用于我的计算机,但它需要在客户端服务器上运行。每当他们使用相同的csv文件和目标表创建相同的包时,他们就会收到上述错误。
我们已经逐步完成了包的创建,一切似乎都没问题。映射都是正确的,但是当它们在最后一步中运行包时,它们会收到此错误。他们正在使用SQL Server 2005。
有人可以建议从哪里开始寻找这个问题吗?
答案 0 :(得分:107)
从任何非unicode源转换为unicode SQL Server表的问题可以通过以下方式解决:
答案 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修复的解决方案:
答案 6 :(得分:4)
答案 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)
不确定这是否仍然存在问题,但我找到了这个简单的解决方案:
希望这很清楚,也很容易理解
答案 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。它对我有用。