#sql-server #database #ssis #etl
Вопрос:
У меня есть два менеджера соединений. Один из них называется «Продукты»и находится на «уровне проекта». У меня есть пакет под названием «Импорт CSV». Я хотел бы иметь цикл foreach, который будет выходить, считывать несколько файлов и добавлять их в таблицу SQL Server для дальнейшего использования. Для этого требуется контейнер цикла foreach, ввод строки пути к файлу, а затем использование этой переменной в выражении свойств диспетчера соединений «Продукты».
Проблема, с которой я сталкиваюсь, заключается в том, что подключение к продуктам находится на уровне проекта, поэтому оно не может видеть никаких переменных с областью действия «Пользователь». Но «Сопоставление переменных» в редакторе циклов foreach, похоже, позволяет мне делать только переменные. Есть ли способ ввести область в поле «Переменная» в сопоставлении переменных, чтобы она могла использовать параметры вместо переменных? Я знаю, что могу отказаться от подключения «Продукты», чтобы больше не быть элементом уровня проекта, но искал лучшее решение. Спасибо!
Комментарии:
1. Может быть, это быстро, но почему бы вам не добавить переменную в свой пакет, которая получает параметр проекта через выражение? Таким образом, вы можете получить доступ к значению параметра через переменную…
2. Я не уверен, как сделать то, что вы предлагаете, хотя я уже некоторое время пытаюсь реализовать. Проблема в том, что цикл foreach управляет процессом, и хотя я думаю, что могу сделать то, что вы предлагаете, мне понадобится изменить параметр, но цикл foreach будет искать переменную. Может быть, я не совсем понимаю, но не уверен, что это возможно.
Ответ №1:
Параметры доступны только для чтения во время выполнения пакета. Вот почему вы не можете использовать его в качестве параметра в перечислителе Foreach — это была бы операция записи.
Как вы также обнаружили, менеджеры соединений на уровне проекта могут иметь только выражения, ссылающиеся на параметры проекта. Вероятно, это связано с проблемами параллелизма (Пакет 1 пытается установить имя базы данных в tempdb, а пакет 2 пытается установить базу данных в master — какой из них более правильный?). Или это просто расширение основного параметра, доступного только для чтения-менеджер подключений проекта может быть изменен только значениями, доступными только для чтения, поэтому он стабилен во время выполнения пакета. Там может быть документация, объясняющая, почему этот дизайн, но это дизайн, и вряд ли он изменится.
Если вы попытаетесь вручную ввести локальные переменные в конструктор выражений (здесь я пытался заполнить InitialCatalog
из локальной переменной DatabaseName
), вы получите ошибку оценки вне области действия.
НАЗВАНИЕ: Конструктор выражений
Выражение не может быть оценено.
Для получения справки нажмите: http://go.microsoft.com/fwlink?ProdName=Microsoft® Visual Studio®amp;ProdVer=15.8.28010.2046amp;EvtSrc=Microsoft.DataTransformationServices.Управления.Работа над заданием.TaskUIFrameworkSRamp;EvtID=Неверное выражение и идентификатор ссылки=20476
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Переменная «User::DatabaseName» не была найдена в коллекции переменных. Переменная может не существовать в правильной области видимости.
Попытка проанализировать выражение «@[Пользователь::Имя базы данных]» не удалась и вернул код ошибки 0xC00470A6. Выражение не может быть проанализировано. Он может содержать недопустимые элементы или может быть неправильно сформирован. Также может возникнуть ошибка нехватки памяти.
Как я могу получить то, что хочу?
Вариант 1. Понизьте уровень продуктов с менеджера подключений на уровне проекта до менеджера подключений на уровне пакета. Увеличивает сложность обслуживания при развертывании с несколькими пакетами, но решает проблему разработки. Если это менеджер подключений к файлам — это, вероятно, лучший дизайн. Я редко обмениваюсь файлами (Excel, txt, csv) между пакетами из-за строгой природы метаданных потока данных. Однако подключения к базе данных обычно являются общими, поскольку элементы метаданных (таблицы) находятся на более низком уровне абстракции, поэтому нет проблем с метаданными.
И это все. Я думал, что вы, возможно, сможете обойти это с помощью дополнительного пакета и параметров, но они тоже выйдут за рамки.
Комментарии:
1. Я подумал, что это может быть единственным способом. Это CSV-файл, и на самом деле он в основном читается одним пакетом, поэтому я думаю, что ваше предостережение правильно.