64

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

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

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

谁能建议从哪里开始寻找这个问题?

4

16 回答 16

107

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

  • 将数据转换转换步骤添加到您的数据流
  • 打开数据转换并为适用的每种数据类型选择 Unicode
  • 记下每个适用列的输出别名(默认情况下它们被命名为 Copy Of [original column name])
  • 现在,在目标步骤中,单击映射
  • 将所有输入映射更改为来自上一步中的别名列(这是很容易被忽略的步骤,会让您想知道为什么仍然会遇到相同的错误)
于 2009-12-15T19:17:50.877 回答
14

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

此外,为什么一切都是(据说)nvarchar(max)?如果我见过,那是一种代码味道。您知道 SQL Server 如何存储这些列吗?它们使用指向实际行中存储列的位置的指针,因为它们不适合 8k 页。

于 2009-08-19T12:28:16.513 回答
8

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

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

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

于 2009-10-20T19:45:36.577 回答
8

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

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

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

于 2013-06-11T14:46:34.423 回答
7

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

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

而不是做

SELECT myField = myNvarchar20Field
FROM myTable

你可以做

SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable
于 2013-08-20T15:25:18.267 回答
5

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

  1. Data Conversion如下所示向您的数据流中添加一个项目;

在此处输入图像描述

  1. 双击该Data Conversion项目,并将其设置为如下所示:

在此处输入图像描述

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

在此处输入图像描述

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

于 2015-11-09T17:54:13.980 回答
4

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

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

于 2011-09-09T05:12:55.643 回答
4

迈克,我在 SQL Server 2005 中遇到了与 SSIS 相同的问题......显然,DataFlowDestination 对象将始终尝试验证传入的数据,并将其转换为 Unicode。转到该对象,高级编辑器,组件属性窗格,将“ValidateExternalMetaData”属性更改为 False。现在,转到 Input and Output Properties 窗格、Destination Input、External Columns - 设置每一列的数据类型和长度以匹配它要进入的数据库表。现在,当您关闭该编辑器时,这些列更改将被保存并且不会被验证,并且它将起作用。

于 2010-08-24T17:07:52.190 回答
1

已解决-原始问题:

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

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

比上面的东西容易得多。

于 2015-02-05T17:07:35.020 回答
1

如果有 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 !
于 2014-02-05T13:53:32.610 回答
1

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

于 2012-07-22T10:20:27.440 回答
1

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

  1. 右键单击 Ole DB 源
  2. 选择“编辑”
  3. 选择输入和输出属性选项卡
  4. 在“输入和输出”下,展开“Ole DB 源输出”外部列和输出列
  5. 在输出列中,选择违规字段,在右侧面板上确保数据类型属性与外部列属性中的字段匹配

希望这是清晰易懂的

于 2015-03-03T11:09:24.017 回答
0

有时,当我们在源查询/视图/过程中选择静态字符作为字段并在 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
于 2016-04-21T10:49:54.907 回答
0

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

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

于 2017-05-05T13:54:22.663 回答
-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
于 2014-07-14T13:31:28.030 回答
-2

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

于 2015-09-02T19:18:04.313 回答