Почему источник Excel считает, что мой запрос имеет параметры?

Часть моего текущего проекта включает в себя преобразование электронной таблицы Excel 2007 с несколькими вкладками в равное количество плоских файлов с разделителями вертикальной чертой с использованием пакета SSIS. У меня есть одна задача потока данных, которая открывает файл 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$]

Поле «Первая строка содержит имена столбцов» в диспетчере соединений 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$]

Любая помощь будет оценена по достоинству.


person Gorcq    schedule 18.11.2014    source источник


Ответы (1)


Хорошо, я понял это и напишу здесь, если у кого-то еще возникнет аналогичная проблема, потому что я провел несколько часов в Google, пытаясь понять, что происходит.

Оказывается, не все рабочие листы на самом деле ИМЕЮТ 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$]

И это исправляет это.

person Gorcq    schedule 19.11.2014