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

时间:2011-12-25 09:36:00

标签: sql-server-2008 excel ssis codepages import-from-excel

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

但是当使用SSIS导入和导出对话框时,即使我将OnTruncation选项设置为Ignore,我也会在标题中收到上述错误。

我试图清除列数据,但它成功了(所以我确保问题出在ShortDescription列中)。 我试图将整个数据复制到另一本excel工作簿,但仍然没有运气。

任何想法???

7 个答案:

答案 0 :(得分:66)

我假设你在SSIS对话框中尝试使用Excel Source导入它?

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

因此,要从包含大量数据的行而不截断的列导入数据,有两个选项:

  1. 您必须确保至少有一个采样行中的[ShortDescription]列包含长度超过255个字符的值。这样做的一种方法是使用REPT()函数,例如, = REPT('z',4000),它将创建一个字母'z'的4000字符串。
  2. 您必须增加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下) 注册表项。
  3. 您可以在以下两个链接中查看更多信息:

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

答案 1 :(得分:32)

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

enter image description here

答案 2 :(得分:8)

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

答案 3 :(得分: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。

这些设置没有错误。

答案 4 :(得分:1)

需要更改注册表组件的备用位置以解决此问题。

如果你在

找不到它
  

开始 - > RUN-> RegEdit-> HKEY_LOCAL_MACHINE \ SOFTWARE \微软\喷气\ 4.0 \发动机\ Excel中

然后查看

  

开始 - > RUN-> RegEdit-> HKEY_LOCAL_MACHINE - >软件 - > Wow6432Node - >微软 - > Jet - > 4.0 - >引擎 - > Excel中

答案 5 :(得分:1)

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

  1. 复制具有单元格值的行>在excel的开头255个字符,使该行成为excel中的第一行
  2. 从上面的链接更改注册表值。

答案 6 :(得分:0)

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