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

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

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

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

有任何想法吗 ???

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

如果是这样的话,问题可能是当SSIS在创buildExcel源文件时,在电子表格的开始处对一些行进行采样。 如果在[ShortDescription]列中没有注意到太大,则默认为255个字符的文本列。

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

  1. 您必须确保至less一个采样行中的[ShortDescription]列包含长度超过255个字符的值。 这样做的一种方法是使用REPT()函数,例如= REPT('z',4000),它将创build一个string“z”的4000个string。
  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 )registry项。

你可以在这两个链接看到更多的信息:

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

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

在这里输入图像说明

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

当我试图导入一个包含中文字符的大文件时,出现了这个错误,还有一些无效的(大)string。

文本文件以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) 

在审查数据types映射

 - On Error: Ignore - On Truncation: Ignore 

我的目标列有宽度= 50。

我没有得到这些设置的错误。

有一个registry组件的替代位置需要更改以解决此问题。

如果你找不到它

开始 – >运行 – > RegEdit-> HKEY_LOCAL_MACHINE \ SOFTWARE \微软\喷气\ 4.0 \发动机\ EXCEL

然后看看

开始→运行→注册→HKEY_LOCAL_MACHINE→软件→Wow6432Node→微软→Jet→4.0→引擎→Excel

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

  1. 将单元格值大于255个字符的行复制到excel的开头,使该行成为excel中的第一行
  2. 从上面的链接更改registry值。
Interesting Posts