如何将Oracle数据库转为MsSql

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将Oracle数据库转为MsSql相关的知识,希望对你有一定的参考价值。

现有一Orace数据库,接近100张表,想转为SqlServer,只要表结构就行,有没有什么好的方法?

转换步骤:
1、 把Oracle数据库转换成基于Oracle的pdm文件。
1) 打开PowerDesigner,单击file/Reverse Engineer/database,在弹出的New Physical Data Model对话框的General选项卡中,命名Model name(本例中命名为test_pdm_oracle),DBMS选为ORACLE Version 11g,单击确定。在弹出的Database Reverse Engineering Options对话框的Selection选项卡中,单击Using a data source 前的单选按钮,单击下面方框右方的圆柱按钮,在弹出的Connect to a Data Source对话框中单击Configure按钮,在弹出的Configure Data Connections对话框中选择rzh_oracle,然后单击Configure按钮上方的方框选择rzh_oracle。然后输入User ID和Password,选中Save password,单击Connect按钮,单击确定,单击确定,然后会弹出Database Reverse Engineering对话框,选择要转换的表,单击OK按钮。在弹出的Confirm Selection对话框中单击OK按钮。待转换完后,保存test_pdm_oracle。
2、 把test_pdm_oracle.pdm转换成.cdm文件
1) 在Workspace中选中test_pdm_oracle,然后单击标题栏中的Tools在弹出的菜单中选择Generate Conceptual Data Model,弹出CDM Generation Options对话框,在General选项卡中单击Generate new Conceptual Data Model前的单选按钮,重命名Name(这里命名为test_cdm),单击确定。保存test_cdm。
3、 把test_cdm转换为基于MSSQL Server 2005的pdm文件。
1) 选中test_cdm。单击标题栏中的Tools,在弹出菜单中单击Generate Physical Data Model,弹出PDM Generation Options对话框,在其中的General选项卡中,单击Generate Physical Data Model单选按钮,DBMS文本框选为Microsoft SQL Server 2005,重命名Name(这里为test_pdm_ms),单击确定。保存test_pdm_ms。
4、 由test_pdm_ms生成相应的MS SQLServer 2005数据库。
1) 选中test_pdm_ms,单击标题栏中的Database,选择弹出菜单中的Generate Database,弹出Database Generation对话框,在General选项卡中选择好Directory,和File name,Generation type选择Direct Generation,单击确定。在弹出的Connect to a Data Source对话框中,选择ODBC machine data source。单击configure按钮,选择rzh_SQL,单击确定回到Connect to a Data Source对话框,单击configure按钮上方的方框选择rzh_SQL,输入User ID和Password,选择Save Password,单击Connect按钮。在弹出的Execute SQL Query对话框中单击Run按钮,待执行完毕,单击Close关闭对话框。
参考技术A 使用SQL Server Management Studio 打开数据库 TASK -> IMPORT DATA 然后按照你的要求 连接到ORACLE 后可以直接 把ORACLE 表(包含数据) 导入到SQL server中。 但是注意 某些类型如LOB 的话 需要特殊的处理下。本回答被提问者采纳

Oracle怎样将可变列转为行??

一张病人费用表FEE,含有以下字段:住院号(NO)、费用项目编号(CODE)、费用金额(COST)。
其中每一个病人可能有若干种费用项目,并且费用项目是可重复的。详见下表:

住院号
费用项目编号
费用金额
ZY001
010
30
ZY001
055
60
ZY001
055
40
ZY001
068
50
ZY002
011
30.2
ZY002
047
68
ZY002
055
80
ZY002
019
55.5
ZY002
019
63

现在要求统计出每个病人的每一项费用的金额汇总
以如下方式输出:

住院号
010
055
068
……
ZY001
30
100
50
……
ZY002
0
80
0
……
原表样式:

处理结果:

方法1:decode

--用decode实现行转列
--适用范围:8i,9i,10g及以后版本
SELECT NO,
SUM(decode(CODE, '010', COST)) "010",
SUM(decode(CODE, '011', COST)) "011",
SUM(decode(CODE, '019', COST)) "019",
SUM(decode(CODE, '047', COST)) "047",
SUM(decode(CODE, '055', COST)) "055",
SUM(decode(CODE, '068', COST)) "068"
FROM FEE
GROUP BY NO
ORDER BY NO asc

方法2:pivot

--用Pivot实现行转列
--适用范围:11g及以后
SELECT *
FROM FEE
  PIVOT (
  SUM(NVL(COST,0))
  FOR CODE          
  IN  ('010','011','019','047','055','068')
) ORDER BY NO asc;

 结果如下:

追问

非常感谢您的回复
您的回复让我获益匪浅
只是这里的CODE列值是可变的
采取硬编码方式灵活性不够
请问您还有什么更好的方法吗?

追答

拼接动态SQL就行了。

declare
   sqlstr varchar2(8000) := '';
begin
   select WM_CONCAT(''''||CODE||'''') into sqlstr 
   from (
   select distinct CODE from FEE order by CODE
   ) t;
   sqlstr:='SELECT *
FROM FEE
  PIVOT (
  SUM(NVL(COST,0))
  FOR CODE          
  IN  ('||sqlstr||')
) ORDER BY NO asc';
  execute immediate sqlstr;
  sqlstr := 'CREATE OR REPLACE VIEW tmp_result  AS '|| sqlstr;
  execute immediate sqlstr;
end;

 这里把查询结果放到了视图tmp_result里。查看这个视图就可以了。

select * from tmp_result;

参考技术A select no,sum(case when code='010' then cost else 0 end),
sum(case when code='055' then cost else 0 end),
sum(case when code='068' then cost else 0 end),......
from fee
group by no;
参考技术B SELECT NO,SUM(CODE) ,SUM(COST) FROM FEE group by NO

以上是关于如何将Oracle数据库转为MsSql的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中存储图片的类型为BLOB类型,Java中如何将其读取并转为字符串?

PHP如何将SQL查询结果转为多维数组,并按查询行输出

oracle 结果集行转列,多行数据转为一行显示,第一列内容拼接生成字段名

java 中怎么把字符串转为oracle date类型

oracle日期格式长度9如何转为长度10

根据 Oracle 10g PL/SQL 中的内容将行转为列