我当前项目的一部分涉及使用SSIS包将具有多个标签的Excel 2007电子表格转换为相同数量的竖线分隔的平面文件。我有一个数据流任务打开excel文件,并选择所有选项卡的名称和对象变量。每个循环内的第二个数据流任务尝试从每个选项卡中读取前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$]
"第一行有列名" excel连接管理器中的框未标记。
这就是事情:这适用于大多数标签。上面的那个工作。但是,其中三个导致以下错误:
The SQL command requires 2 parameters, but the parameter mapping only has 0 parameters.
我修改了包以打印日志文件中使用的所有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$]
任何帮助都将不胜感激。
答案 0 :(得分:3)
好吧,我明白了,并且会在这里写下来以防其他人有类似的问题,因为我花了几个小时在Google上试图找出发生了什么。
事实证明,并非所有工作表实际上都有32列。起初我没有想到这可能是一个问题,因为当您在Excel中打开Excel文件时,如果您只是滚动更多,则总会有更多列。但是,Microsoft Jet读取Excel文件的方式,每个工作表都有固定数量的列。
导致问题的工作表是少于32列的工作表。如果只有30列,我尝试选择F32,Microsoft Jet假定F32应该是参数的名称。据我所知,SSIS 2008不允许您设置与Jet一起使用的参数值,但Jet会解析您的查询,并确定如果找不到某些列名,则需要参数。< / p>
为了解决这个问题,我更改了获取工作表名称的步骤以返回每个工作表中的列数,然后将查询更改为对任何不存在的列返回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$]
这就解决了这个问题。