Динамический пакет SSIS для загрузки N таблиц из Oracle в SQL

У нас есть N таблиц на сервере Oracle, и мы хотели загрузить все эти таблицы из Oracle на сервер SQL. Мы создаем для них динамические пакеты SSIS, которые будут принимать имя сервера Oracle, имя БД, имя схемы, список таблиц и т. д. и будут загружать все эти таблицы на сервер SQL. Мы добавили Link Server на SQL Server (SSMS) для Oracle.

Но у нас нет эффективного способа сделать то же самое. Как мы можем добиться этого в одном пакете SSIS. Как мы можем обрабатывать метаданные таблиц Oracle и создавать их на сервере SQL? Этот пакет SSIS также должен динамически создавать таблицы на сервере SQL, для этого мы попробовали временную таблицу в пакете SSIS.


person Ajit Medhekar    schedule 08.09.2020    source источник
comment
Возможно, связанный сервер Oracle показывает все таблицы из всех схем в студии управления сервером sql, и это поможет вам начать получение информации о схеме со связанного сервера.   -  person Filburt    schedule 08.09.2020
comment
По моему опыту, службы SSIS по своей природе неэффективны при копировании из оракула в mssql. Однажды мне представили один, который копировал чуть менее 1 миллиона строк за 4 часа. Я поставил трассировку оракула на процесс и обнаружил, что он работает построчно, «медленно-медленно». Написал процедуру PL/sQL, используя oracle db_link, чтобы просто "вставить в mssql_tble.. выбрать.... из ora_tbl;" (один оператор sql) и завершается за четыре минуты.   -  person EdStevens    schedule 08.09.2020
comment
@EdStevens: но после использования db_link, как та же таблица динамически создается на SQL с необходимыми метаданными столбцов.   -  person Ajit Medhekar    schedule 08.09.2020
comment
@Filburt: Да, мы добавили связанный сервер и можем проверить схему для таблиц Oracle. Но то же самое необходимо динамически преобразовывать в таблицы SQL, а также таблицы должны создаваться динамически на SQL, поскольку существует более 500 таблиц. Таким образом, мы не можем создать отдельный пакет SSIS для создания таблицы SQL для таблицы Oracle, а затем загрузить данные.   -  person Ajit Medhekar    schedule 08.09.2020
comment
см. мой предложенный ответ .. появится через минуту   -  person EdStevens    schedule 08.09.2020


Ответы (1)


Поскольку вам нужно сделать это с большим количеством таблиц, я бы написал что-то вроде процедуры pl/sql, построенной примерно так:

объявить v_sql varchar2 (1024);

begin
for x in (select owner, table_name from dba_tables where .....)
  v_sql := 'created table '||
           table_name ||
           '@mssql a select * from '||
           x.owner || '.' || x.table_name || ';';
  exec immediate v_sql;
end loop;
end;
/

или, если вы хотите просмотреть его перед запуском, используйте sql для написания sql. В sqlplus:

set echo off feedback off verify off trimsp on pages 0
spool doit.sql
select 'create table '||
        table_name ||
        '@mssql as select * from '||
        owner || '.' || table_name || ';'
from dba_tables
where .....
;
spool off

затем проверьте буферный файл sql на наличие проблем перед запуском.

Весь приведенный выше код не приходит мне в голову. Возможны незначительные проблемы с синтаксисом.

person EdStevens    schedule 08.09.2020