2014-10-10 3 views
0

Мне нужно переместить данные между двумя базами данных SQL Server. Моя задача - экспортировать данные в виде текстовых (.dat) файлов, переместить файлы и импортировать их в пункт назначения. Мне нужно перенести более 200 таблиц.SSIS - Экспорт нескольких таблиц SQL Server в несколько текстовых файлов

Это то, что я пытался

1) Я использовал задачу Execute SQL, чтобы принести мои таблицы. 2) Используется a Для каждого цикла для циклического преобразования имен таблиц из коллекции. 3) Использовал задачу сценария внутри каждого цикла для создания пути назначения текстового файла. 4) Вызвал DFT с именем таблицы в переменной для источника ole db и именем пути в переменной для целевого плоского файла.

Первая таблица извлекает штраф, но вторая настольная бомба с ошибкой синхронизации. Я вижу, что это многочисленные сообщения, но не удалось найти тот, который соответствует моему сценарию. Поэтому отправляйте сюда.

Даже если я получаю пакет для работы с несколькими ДПФ, вторая таблица со второго ДПФ не экспортирует столбцы, потому что диспетчер соединений с плоским файлом по-прежнему запоминает первые столбцы таблицы. Есть ли способ заставить его забыть колонки?

Любые мысли о том, как я могу экспортировать несколько таблиц в несколько текстовых файлов, используя один DFT, используя динамическую переменную источника и назначения?

Спасибо и оцените вашу помощь.

+0

Я предполагаю, что есть причина, по которой вы не просто загружаете данные от A до B и пропускаете весь файл? – billinkc

+0

Да. Пункт назначения иногда может быть производством, и наш администратор базы данных и безопасность не допускают этого по разным причинам. Иногда нам может потребоваться провести данные определенного дня, а затем повторно подать заявку через пару дней в цель. Эти две причины. –

+0

Достаточно честный. Короткий ответ заключается в том, что вы не можете делать то, что вы пытаетесь сделать. Поток данных тесно связан с исходными метаданными и не может быть изменен во время выполнения. Если вы можете установить [BIDS Helper] (http: //bidshelper.codeplex.com), я могу показать вам, как автоматизировать создание пакета с помощью некоторого Biml – billinkc

ответ

0

Я понял способ сделать это. Я думал, что поделюсь, если кто-нибудь застрянет в той же ситуации.

Итак, в общем, мне нужно было экспортировать и импортировать данные через файлы. Я также хотел использовать файл формата, если это возможно по разным причинам.

Что я сделал

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, но вам нужно написать код для этого.

Я также создал файл конфигурации пакета, где я могу динамически изменять имя базы данных, имя сервера, данные и файлы формата файла.

Спасибо.

1

К сожалению, Bulk Import Task позволяет нам эффективно использовать файлы формата для сопоставления столбцов между источником и получателями. Задача массового импорта использует команду BULK INSERT TSQL для импорта данных, для выполнения пользователь должен иметь привилегию сервера BULKADMIN.

Большинство компаний не разрешат привилегию сервера BULKADMIN по соображениям безопасности. Следовательно, использование задачи сценария для создания операторов BCP является хорошим и простым вариантом для экспорта. Вам не нужно создавать .bat-файл, так как сам скрипт может выполнять команды dos, которые выполняются под учетной записью .NET.

+0

Спасибо. Да, у меня была такая же проблема с привилегиями. Однако это решение соответствует моим потребностям. –

Смежные вопросы