2015-02-23 156 views
0

我有一个SSIS包(SQL Server 2008)。我有一个Excel源文件(XLS 97-2003),我想先导入一个SQL表,将所有内容存储为字符串(数字和日期存储为例如rae)。然后,我从这个表中获取数据到其他表格。SSIS从Excel到SQL Server:数据类型长度

Excel的源被配置是这样的:在所述第一步骤中发生Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*********;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1";

我的问题。让我解释一下: 我的一些列MIGHT包含大文本。我确切知道这些列是什么。

的问题是:

  • 一方面,如果配置了源列被ntext和如果有长文本(> 255字符),然后确定。如果没有数据是这些列或短文本(< 255 char),或者在前8行后面有长文本,我会收到一个错误消息(Excel源代码中的红色框...不会再继续执行)。另一方面,如果源列被配置为(wstr,255),并且如果没有数据或短数据(< 255 char),则一切正常。如果有大文本,我会得到一个错误(这似乎是合乎逻辑的)。

我想配置我的软件包,以便在数据源包含比预期更小的数据时不会出错。在我看来,这是相当合理的,但我无法实现...

任何帮助将不胜感激。

回答

1

根据MSDN文档SSIS,你应该阅读这两个:

缺失值。 Excel驱动程序读取指定源中的某些行数(默认情况下为8行),以猜测数据类型 每列 ...有关详细信息,请参阅PRB:将Excel值返回为NULL as NULL使用DAO OpenRecordset 。

截断文本。当驱动程序确定Excel列包含文本数据时,驱动程序将根据其采样的最长值选择数据类型(字符串或备注) 。如果驱动程序不在 所取样的行中发现长度超过255个字符的任何值,则它将该列视为备注列的255个字符的字符串列,而不是 。因此,长度超过255个字符的值可能会被截断为 。 要从备注列中导入数据而不截断, 必须确保至少一个采样的 行中的备注列包含的值超过255个字符,或者必须增加驱动程序采样的行数包括这样一排。您 可以通过增加 TypeGuessRows值 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel注册表中 密钥的值来增加采样的行数。有关详细信息,请参阅PRB:从Jet 4.0传输数据 OLEDB源失败,带有错误。

因此,似乎要么你试图改变在运行Excel源结构(不与Excel的供应商合作),或者你有没有上面的(即没有长文本或长文本中列出适合要求数据8行之后)。我想你可以用两种可能的方法处理这个问题:

  1. 粘贴虚拟NTEXT - 将数据大小写入这些列。节省很多的神经。您可以在第一行执行此操作,因此在检查列内容后,Excel提供程序不会受挫。
  2. 使用MSDN链接增加行采样设置。无论如何,如果您在这些专栏中没有任何文字,那将会失败。

PS。第三种方法根本不是使用Excel提供程序。将Excel文件保存为CSV并使用平面文件源,您不会遇到此问题。只有当您100%确定源文件符合所有要求并且永不意外更改其结构时,Excel Source才是有效的。

+0

坦克的想法!我想我会坚持第一个建议 – Thibault 2015-02-23 21:40:53

+0

该文件顶部的虚拟行是一个工作解决方案。最重要的是,它保证我的其他列(即日期类型)也转换为文本,这正是我最初想要的。 – Thibault 2015-02-26 08:55:11