#sql-server #database #ssis
#sql-server #База данных #ssis
Вопрос:
Я использую SSIS для выполнения серии сложных операций экспорта данных, и я столкнулся с препятствием. Я заполнил переменную пакета набором записей. Я хотел бы использовать цикл foreach для перебора каждой строки в наборе записей. Я хотел бы обновить один из столбцов в каждой строке на основе некоторых вычислений, которые я выполнил внутри задачи скрипта.
Возможно ли это? Я знаю, что в C # коллекция foreach неизменяема, но я не знаю, работает ли служба SSIS таким же образом.
К сожалению, я не нашел хороших примеров использования вместо этого конструкции цикла for, которая могла бы быть потенциальным решением.
Ответ №1:
Когда вы помещаете данные в набор записей, они сохраняются в объектной переменной. Вы можете использовать контейнер цикла Foreach — и зациклить объектную переменную. Затем вы создаете некоторые переменные для хранения каждого столбца для строки — и тогда у вас появляется возможность делать все, что вам заблагорассудится, будь то задача потока данных, инструкция sql, задача скрипта (c #) или что-либо еще.
Смотрите http://www.sqlis.com/post/Shredding-a-Recordset.aspx для иллюстрированного примера того, как это сделать и отправить электронное письмо для каждой строки.
Комментарии:
1. Я могу зайти так далеко, но хочу обновить данные в исходном наборе записей, а не просто редактировать столбцы. Все еще тестирую, можно ли изменить исходный набор записей в цикле foreach.
2. Могу ли я спросить, в чем причина этого, поскольку набор записей является местом назначения в памяти, которое нигде не сохраняется. Если вы собираетесь где-то его сохранить, просто выполните вычисления, пока сохраняете его где угодно.
3. Это хороший момент. Сохраняя запись в памяти, а затем сохраняя ее по назначению позже, я дублирую работу. Спасибо за помощь!
4. О, и, кстати, я не думаю, что вы можете каким-либо образом изменять значения в наборе записей, поскольку foreachloop извлекает это в другие переменные, не имея доступа к родительскому набору записей (насколько я знаю, возможно, некоторые c #-взломщики узнают, можно ли это сделать.)