#sql-server #excel #ssis #etl #foreach-loop-container
#sql-server #excel #ssis #etl #контейнер foreach-loop-
Вопрос:
Контейнер цикла Foreach в моем процессе не помещает новое имя файла в установленную переменную. Этот процесс повторяется столько раз, сколько есть файлов, соответствующих критериям, мне просто нужно, чтобы имя файла было динамическим.
Я создал имя переменной, которое содержит полный путь к первому файлу в моем желаемом каталоге. Выглядит примерно так C:SomepathExcelFile.xlsx
Я также создал переменную с именем ExtProperties, которая будет использоваться в ConnectionString со значением "Excel 12.0;HDR=Yes"
Контейнер цикла Foreach имеет следующие настройки:
- Для перечислителя установлено значение Foreach File Enumerator
- Папка — это каталог, в котором хранятся мои файлы
- В настоящее время для файлов установлено значение *.xlsx
- Для имени извлекаемого файла установлено значение Full Qualified
Переменной ExcelFileName, о которой я упоминал ранее, присвоен индекс 0
Я создал диспетчер соединений Excel, указывающий на исходный файл со следующими соответствующими свойствами:
- Проверка задержки: True
-
Выражение: Я пробовал как устанавливать
ExcelFilePath
в переменную ExcelFileName, так и использовать следующее для строки подключения:"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" @[User::ExcelFileName] ";Extended Properties="" @[User::ExtProperties] """
Прямо сейчас он использует только строку подключения.
- Сохранить то же соединение: False
Поток данных использует источник Excel с использованием диспетчера соединений Excel. Цель потока данных — извлечь количество записей из каждого файла Excel, получить имя файла и пользователя, выполняющего загрузку, и перенести информацию в БД. Однако при отправке в базу данных имя файла и количество записей постоянно используются первым файлом, столько же раз, сколько файлов соответствует критериям.
Я не получаю сообщений об ошибках или предупреждений. Я использовал следующий скрипт в своем потоке управления, чтобы проверить, изменилось ли значение переменной, но всплывающее окно сообщения показывает, что я по-прежнему получаю начальное значение.
MessageBox.Show(Dts.Variables["User::ExcelFile"].Value.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
Я читал темы об этом в течение нескольких дней, и это были настройки, которые были предложены для работы, но это все еще проблема для меня. Будем признательны за любую помощь.
Ответ №1:
Судя по первому изображению, похоже, что вы установили переменную ExcelFileName для вычисления как выражение, поскольку знак выражения (fx) показан на значке переменной:
Просто удалите выражение из переменной и убедитесь, что EvaluateAsExpression
свойству присвоено значение False
Комментарии:
1. Большое вам спасибо. Это было правильно. Я нигде не видел указания на это, поэтому я надеюсь, что этот вопрос поможет другим в будущем.
Ответ №2:
В редакторе цикла foreach выберите имя и расширение вместо этого или полностью. и проверьте, есть ли у вас вложенные папки для обхода.