【问题标题】:Why is SSIS ignoring the last column of my import from an Excel source?为什么 SSIS 会忽略我从 Excel 源导入的最后一列?
【发布时间】:2015-11-30 14:58:30
【问题描述】:

我是一名商业智能开发实习生,如果我不像某些人那样精通 SQL 或 Microsoft BI Stack,请见谅。

我正在尝试将数据从 Excel 文件 (.xls) 导入 SQL Server 数据库表,但由于某种原因,连接管理器完全忽略了我的数据的最后一列。

更奇怪的是,如果我在 Excel 中打开 Excel 文件时尝试在 SSIS 中设置连接管理器,SSIS 会读取数据。 (我想我一开始是无意中这样做的,结果让我感到惊讶。)

这是未在 Excel 中打开文件的数据预览:

以及在 SSIS 中设置连接管理器之前打开文件的数据预览:

这两个都描述了文件中数据的结尾,但出于某种原因,如您所见,在第一个数据预览中省略了“区域”列。

到目前为止我尝试过的步骤:

  1. 使用脚本任务转换为 .csv 文件
  2. 使用 ADO.Net 源并以这种方式读取 excel 数据
  3. 使用 SQL 命令查看数据,而不是从表或工作表中选择
  4. 更改 OpenRowset 属性以指定列

关于源文件的细节:

  1. 前 3 行数据为空(图片除外)
  2. 第 4 行包含标题数据
  3. 'Zone' 列采用常规格式,其他所有不包含日期的列也是如此

如果有人有任何想法或建议,我将不胜感激。

谢谢!

【问题讨论】:

  • 您是在阅读整个 excel 表还是在使用选定的范围,例如SELECT * FROM [MyWorksheet$B5:J100] ?
  • 我都试过了,都没有用。

标签: sql-server database excel ssis


【解决方案1】:

有时 SSIS 无法检测给定列的数据类型。这可能导致意外的 NULL。将 IMEX=1 添加到 ConnectionString 可以清除此故障。

示例 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your_Workbook.xls;Extended Properties="EXCEL 8.0;HDR=NO;";

变成

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your_Workbook.xls;Extended Properties="EXCEL 8.0;HDR=NO;IMEX=1";

有关更多详细信息,请参阅此博客文章(不是我自己的作品):

http://blog.concentra.co.uk/2013/05/15/why-ssis-always-gets-excel-data-types-wrong-and-how-to-fix-it/

【讨论】:

  • 与其说是数据类型,不如说是 SSIS 根本没有检测到该列。正如您在一个示例中看到的,Bill to Account 是最后一列,但在另一个示例中,在实际文件中,Zone 是最后一列。
  • 对不起,我看不到示例,我的防火墙阻止了它们。我尝试重现,但无法创建相同的错误。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多