动态 SSIS 包将 N 个表从 Oracle 加载到 SQL
Posted
技术标签:
【中文标题】动态 SSIS 包将 N 个表从 Oracle 加载到 SQL【英文标题】:Dynamic SSIS package to load N tables from Oracle to SQL 【发布时间】:2020-09-08 13:11:43 【问题描述】:我们在 Oracle 服务器上有 N 个表,我们希望将所有这些表从 Oracle 加载到 SQL 服务器。我们正在为其创建动态 SSIS 包,它将采用 Oracle ServerName、DB 名称、模式名称、表列表等,并将所有这些表加载到 SQL 服务器。我们为 Oracle 添加了 SQL Server 上的链接服务器 (SSMS)。
但是我们没有找到有效的方法来做同样的事情。我们如何在单个 SSIS 包中实现这一点。我们如何处理 Oracle 表的元数据并在 SQL 服务器上创建相同的元数据?这个 SSIS 包也应该在 SQL 服务器上动态创建表,为此我们尝试了 SSIS 包中的临时表。
【问题讨论】:
也许Oracle linked server shows all tables from all schemas in sql server management studio 可以帮助您开始从链接服务器检索架构信息。 我的经验是 SSIS 在从 oracle 复制到 mssql 方面天生就效率低下。曾经有人向我展示了一个需要 4 个多小时才能复制不到 100 万行的数据。我对该进程进行了 oracle 跟踪,发现它正在逐行运行,“逐行缓慢”。使用 oracle db_link 编写了一个 PL/sql 过程,以简单地“插入 mssql_tble .. select .... from ora_tbl;” (一条 sql 语句),它在四分钟内完成。 @EdStevens :但是在使用 db_link 之后,如何在 SQL 上动态创建同一个表,并使用所需的列元数据。 @Filburt :是的,我们已经添加了一个链接服务器,我们可以检查 Oracle 表的架构。但是同样需要动态转换为 SQL 表,并且表应该在 SQL 上动态创建,因为有 500 多个表。所以我们不能创建单独的 SSIS 包来为 Oracle 表创建 SQL 表然后加载数据。 请看我建议的答案 .. 马上就来 【参考方案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 文件是否有任何问题。
上面的所有代码都在我脑海中。可能存在轻微的语法问题。
【讨论】:
以上是关于动态 SSIS 包将 N 个表从 Oracle 加载到 SQL的主要内容,如果未能解决你的问题,请参考以下文章
SSIS 包将文件从一个文件夹移动到 SFTP (WinSCP) 中的另一个文件夹(SSIS 的 SFTP 任务)