为什么 Excel 源认为我的查询有参数?

Gor*_*rcq 3 ssis jet excel-2007

我当前项目的一部分涉及使用 SSIS 包将具有多个选项卡的 Excel 2007 电子表格转换为相同数量的管道分隔平面文件。我有一个数据流任务,它打开 excel 文件并将所有选项卡的名称选择到对象变量中。for each 循环中的第二个数据流任务尝试从每个选项卡读取前 32 列。第二个数据流任务中的 excel 源设置为使用来自变量的 sql 命令,该变量是一个表达式,将选项卡名称替换为其他常量 sql 语句,如下所示:

SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17,
    F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31, F32
FROM [Securities Portfolio$]
Run Code Online (Sandbox Code Playgroud)

excel连接管理器中的“第一行有列名”框没有标记。

事情是这样的:这适用于大多数选项卡。上面那个有效。但是,其中三个导致以下错误:

The SQL command requires 2 parameters, but the parameter mapping only has 0 parameters.
Run Code Online (Sandbox Code Playgroud)

我修改了包以打印日志文件中使用的所有 SQL 语句。唯一的区别在于选项卡名称。没有任何问号,这就是我认为 SSIS 用来标记参数的方法。我无法弄清楚是什么导致了这种情况,甚至无法弄清楚失败的 SQL 查询与正常工作的查询有何不同:

SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17,
    F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31, F32
FROM [Capital - Part1$]
SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17,
    F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31, F32
FROM [Capital - Part2$]
SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17,
    F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31, F32
FROM [Securities Sources$]
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

Gor*_*rcq 5

好的,我想通了,我会写在这里以防其他人有类似的问题,因为我花了几个小时在谷歌上试图弄清楚发生了什么。

事实证明,并非所有工作表实际上都有 32 列。起初我没有想到这可能是一个问题,因为当您在 Excel 中打开 Excel 文件时,如果您只是滚动更多列,总会有更多列。但是,Microsoft Jet 读取 Excel 文件的方式是,每个工作表都有固定的列数。

导致问题的工作表是那些少于 32 列的工作表。如果只有 30 列并且我尝试选择 F32,Microsoft Jet 假定 F32 应该是参数的名称。据我所知,SSIS 2008 不允许您设置用于 Jet 的参数值,但 Jet 仍会解析您的查询并确定如果找不到某些列名时需要参数。

为了解决这个问题,我更改了获取工作表名称的步骤,以返回每个工作表中的列数,然后将查询更改为为任何不存在的列返回 NULL。因此,对于只有 30 列的工作表,我现在运行:

SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18,
F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, NULL AS F31, NULL AS F32
FROM [Capital - Part1$]
Run Code Online (Sandbox Code Playgroud)

这解决了它。