从 Excel 文件导入时,文本被截断或目标代码页中的一个或多个字符不匹配

Posted

技术标签:

【中文标题】从 Excel 文件导入时,文本被截断或目标代码页中的一个或多个字符不匹配【英文标题】:Text was truncated or one or more characters had no match in the target code page When importing from Excel file 【发布时间】:2012-01-27 13:53:50 【问题描述】:

我有一个包含四个文本列的 excel 文件: 其中之一称为 ShortDescription ,它具有最长的值。 我在 SQL Server 2008 数据库中创建了一个表,有四列,ShortDescription 列类型设置为 NvarChar(Max)。

但是在使用 SSIS 导入和导出对话框时,我不断收到标题中提到的错误,即使我将 OnTruncation 选项设置为 Ignore。

我尝试清除列数据,并且成功(因此我确定问题出在 ShortDescription 列中)。 我试图将整个数据复制到另一个 Excel 工作簿,但仍然没有成功。

有什么想法吗???

【问题讨论】:

【参考方案1】:

试试这个 - 转到数据流任务>右键单击Excel数据源>单击显示高级编辑器>选择输入和输出属性>展开Excel源输出>展开外部列和输出列并检查错误列并单击这些列标题并更新数据相应地键入(大多数情况下应该是 Unicode 文本流 [DT_NTEXT],否则更改为那个并试一试)。 希望对您有所帮助。

【讨论】:

【参考方案2】:

我假设您正在尝试使用 SSIS 对话框中的 Excel 源来导入它?

如果是这样,问题可能是 SSIS 在创建 Excel 源时在电子表格的开头采样了一些行。如果在 [ShortDescription] 列上没有发现太大的内容,它将默认为 255 个字符的文本列。

所以要从包含大量数据的行中导入数据而不截断,有两种选择:

    您必须确保至少有一个采样行中的 [ShortDescription] 列包含一个超过 255 个字符的值。一种方法是使用 REPT() 函数,例如=REPT('z', 4000),这将创建一个包含 4000 个字母 'z' 的字符串。 您必须增加 Jet Excel 驱动程序采样的行数才能包含这样的行。您可以通过增加HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel 下的 TypeGuessRows 的值来增加采样的行数(如果您的系统是 x64 则在HKEY_LOCAL_MACHINE\SOFTWARE\wow6432node\Microsoft\Jet\4.0\Engines\Excel 下) 注册表项。

您可以在这两个链接中查看更多信息:

http://waxtadpole.wordpress.com/2008/04/28/hello-world/ http://technet.microsoft.com/en-us/library/ms141683.aspx

为了进一步解释,SSIS 在向导的幕后创建了 3 个对象,一个 Excel 数据源对象,一个 SQL 表目标对象,以及它们之间的数据流运算符。 Excel 源对象定义源数据并且独立于其他两个对象而存在。所以当它创建时,我描述的采样就完成了,源列的大小也设置好了。因此,当数据流运算符执行并尝试从 excel 中提取数据以放入表中时,它已经在查看限制为 255 个字符的数据源。

【讨论】:

说的太对了!!!但是如果目标列设置为接受最大数据长度,为什么会发生这种情况?那么源列的长度与它有什么关系??? "注意对于64位系统,对应的key如下:HKLM\SOFTWARE\wow6432node\microsoft\jet\4.0\engines\excel" - link 但是显然这个值最多只能到16?似乎没有太大的改进 - 但我还没有测试过。 对我来说,对顶部文本最长的行进行排序是有效的。 @NourSabouny,我认为他是在说中间的数据流运算符出错,即使目标列设置为 nvarchar(max)。【参考方案3】:

对我来说,这个链接帮助了我:https://support.microsoft.com/en-us/kb/189897

    将单元格值> 255个字符的行复制到excel的开头,使该行成为excel的第一行 从上面的链接更改注册表值。

【讨论】:

【参考方案4】:

注册表组件的另一个位置需要更改以解决此问题。

如果你找不到它

开始-->运行-->RegEdit-->HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

那就进去看看

开始->运行->RegEdit->HKEY_LOCAL_MACHINE -> SOFTWARE -> Wow6432Node -> Microsoft -> Jet -> 4.0 ->Engines -> Excel

【讨论】:

【参考方案5】:

让它工作的一个简单方法是编辑要导入的文件并在第一个位置创建一个新行。这样,它将始终被采样。然后对于任何可能有 >255 个字符的列,只需在单元格中添加 255 个字符即可。导入后,只需删除您添加的垃圾行即可。

【讨论】:

这是我成功的最短路径。 嗯,不知道这与解决方案有何不同。此解决方案似乎更适合 stackexchange。 〜(:【参考方案6】:

当我尝试导入一个包含一些中文字符以及一些无效(大)字符串的大文件时遇到此错误。

文本文件以 UTF8 格式保存。

我的设置:

在常规选项上(没有改变任何东西):

- Locale: English (United States) 
- Unicode: Unchecked
- Code Page: 65001 (UTF-8)

左侧有一个高级选项

- DataType (for column): Unicode String [DT_WSTR] (changed)
- OutputColumnWidth: 4000 (that's the maximum) (changed)

关于评论数据类型映射

- On Error: Ignore
- On Truncation: Ignore

我的目标列的宽度 = 50。

这些设置没有错误。

【讨论】:

感谢您发布此信息。由于上述问题,我在导入期间收到了相同的错误消息:尝试将具有外来字符的数据导入到数据类型不接受外来字符的字段中。我的短期解决方法是从我尝试导入的数据中删除外来字符。【参考方案7】:

从平面分隔文件导入 SQL Server 时,我遇到了这个问题。解决方案是更新违规列的“OutputColumnWidth”值(来自错误消息)。在导入向导的“选择数据源”表单上,我的源是平面文件。在最左侧的窗格中,选择“高级”。然后,您可以设置各个列的属性。就我而言,我的大多数列的“OutputColumnWidth”默认为“50”。我只是将它更新为一个更大的值,不会截断平面文件中的值。

【讨论】:

或者,您可以选择 DT_NTEXT SSIS 类型,而不是猜测 DT_STR 的足够大的限制,它相当于 MSSQL nvarchar(max) 或过时的 ntext 类型。 更新 OutputColumnWidth 和使用 DataType DT_WSTR 的组合对我有用。在 SQL Server 2014 中,DT_WSTR 的 OutputColumnWidth 最多可包含 4,000 个 Unicode 字符宽。这导致类似于下面 40-Love 的回答。 您能一次更改所有这些列吗?我有很多列,我想知道这是否可能。 这是我的问题。 +1

以上是关于从 Excel 文件导入时,文本被截断或目标代码页中的一个或多个字符不匹配的主要内容,如果未能解决你的问题,请参考以下文章

sql server 导入平面文件源数据,错误 0xc02020a1错误 0xc020902a 错误 0xc02020c5,返回状态值 4 和状态文本“文本被截断,或者一个或多个字符在目标代码页...

sql server:错误 0xc02020a1: 数据流任务 1: 数据转换失败。列“列 0”的数据转换返回状态值 4 和状态文本“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。 (

SQL Server 2005 DTS导入平面数据源时(如txt文档),总是被截断,无法执行的错误解决方案

将excel表数据导入sqlserver2008R2 报错

在SSIS中导入CSV:截断错误

phpMyAdmin,在导入 csv 时,文本被截断