Я понял способ сделать это. Я думал, что поделюсь, если кто-нибудь застрянет в той же ситуации.
Итак, в общем, мне нужно было экспортировать и импортировать данные через файлы. Я также хотел использовать файл формата, если это возможно по разным причинам.
Что я сделал
1) Построить ДПФ, который получает мне список имен таблиц из БД, что мне нужно экспортировать. Я использовал «oledb» в качестве источника и «назначение набора записей» в качестве цели и сохранил имена таблиц внутри переменной объекта.
DFT на самом деле не нужен. Вы можете сделать это любым другим способом. Кроме того, в нашем приложении мы сохраняем имена таблиц в таблице.
2) Добавьте «для каждого контейнера цикла» с «для каждого ADO Enumerator», который принимает мою переменную объекта из предыдущего шага в коллекцию.
3) Разбирайте переменную один за другим и создайте инструкции BCP, как показано ниже, внутри задачи Script. При необходимости создайте переменные. Оператор BCP будет храниться в переменной.
Я просматриваю таблицы и создаю несколько операторов BCP, подобных этому.
BCP "DBNAME.DBO.TABLENAME1" из "PATH \ FILENAME2.dat" -S SERVERNAME -T -t "| " -r $ \ п -f "PATH \ filename.fmt"
BCP "DBNAME.DBO.TABLENAME1" из "PATH \ FILENAME2.dat" -S SERVERNAME -T -t "| " -r $ \ п -f "PATH \ filename.fmt"
Операторы помещаются в файл .bat. Это также выполняется внутри задачи сценария.
4) Задача процесса выполнения будет выполнена после выполнения .BAT-файла. Я должен был сделать это, потому что у меня нет возможности использовать команду «master..xp_cmdShell» или команду «BULK INSERT» в моей компании. Если бы у меня была возможность выполнить cmdshell, я мог бы напрямую запустить команду из пакета.
5) Снова добавьте «Для каждого контейнера цикла» с «Для каждого ADO Enumerator», который принимает мою переменную объекта из предыдущего шага в коллекцию.
6) Разбирайте переменную по порядку и создайте такие утверждения BCP, как это, в задаче Script. При необходимости создайте переменные. Оператор BCP будет храниться в переменной.
Я просматриваю таблицы и создаю несколько операторов BCP, подобных этому.
BCP "DBNAME.DBO.TABLENAME1" в "PATH \ FILENAME2.dat" -S SERVERNAME -T -t "| " -r $ \ п -b10000 -f "PATH \ filename.fmt"
BCP "DBNAME.DBO.TABLENAME1" в "PATH \ FILENAME2.dat" -S SERVERNAME -T -t "| " -r $ \ п -b10000 -f "PATH \ filename.fmt"
Операторы помещаются в файл .bat. Это также выполняется внутри задачи сценария.
Был поставлен -b10000, поэтому я могу импортировать его партиями. Без этого многие мои большие таблицы не могли быть скопированы из-за меньшего пространства в tempdb.
7) Запустите файл .bat, чтобы снова импортировать файл.
Я не уверен, что это лучшее решение. Я все еще думал, что поделюсь тем, что удовлетворит мое требование. Если мой ответ не ясен, я был бы рад объяснить, есть ли у вас какие-либо вопросы. Мы также можем оптимизировать это решение. То же самое можно сделать только с помощью скриптов VB, но вам нужно написать код для этого.
Я также создал файл конфигурации пакета, где я могу динамически изменять имя базы данных, имя сервера, данные и файлы формата файла.
Спасибо.
Я предполагаю, что есть причина, по которой вы не просто загружаете данные от A до B и пропускаете весь файл? – billinkc
Да. Пункт назначения иногда может быть производством, и наш администратор базы данных и безопасность не допускают этого по разным причинам. Иногда нам может потребоваться провести данные определенного дня, а затем повторно подать заявку через пару дней в цель. Эти две причины. –
Достаточно честный. Короткий ответ заключается в том, что вы не можете делать то, что вы пытаетесь сделать. Поток данных тесно связан с исходными метаданными и не может быть изменен во время выполнения. Если вы можете установить [BIDS Helper] (http: //bidshelper.codeplex.com), я могу показать вам, как автоматизировать создание пакета с помощью некоторого Biml – billinkc