将一份SQL SERVER数据库生成的T-SQL脚本,转成ORACLE的PL/SQL,其复杂繁琐程度,远远出乎我的意料。

这份SQL SERVER脚本,里面有表,有视图,还有存储过程,以及一些自定义函数。目前,仅勉强将表、视图移植到oracle,存储过程和自定义函数,只能先放弃了。

总结如下:

一、转换工具

oracle自带工具:Oracle SQL Developer。选工具 -“移植”- 草稿编辑器

在下拉框中选择 T-SQL 到 PL/SQL(默认)

有个地方要特别注意,也是这个工具比较脑残的地方,T-SQL脚本一定要通过粘贴的途径输入到左边的输入框,这样才有转换的界面;假如你通过打开文件的方式,系统会把它当成PLSQL,根本没有下拉框出来。我刚开始就是直接打开脚本文件,心想怎么跟网上说的对不上号,几番折腾,才发现这个转换的功能。

我还下载了一个名叫“IspirerMnMTK”的东东,根本安装不上,换了几台机器都不行,不知道啥垃圾。

二、转换

1、这个ORACLE自带的工具转换功能并非万能,好多T-SQL语句都无法识别。

有这些语句存在,它就乱译一通,根本无法执行。比如一些选项,一些字段注释,甚至一些代码注释

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HDBH_BHGH_TJ_PROPVALUE]') AND type in (N'U'))

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'海啸发生次数' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'HDTJ_FORM_TJ9', @level2type=N'COLUMN', @level2name=N'TSU_TIMES'

诸如此类

像这种情况,只有先自行去掉,再给工具翻译。

2、ORACLE不支持

我这次遇到的有两个:

1)NVARCHAR(MAX)

工具翻译成 NVARCHAR2(4000)。问题是,假如一张表里,有2个或以上这样的字段,ORACLE建表时就报字段超长的错。而且,窃以为翻译成NVARCHAR2(4000)也是不准确的,所以手动改为clob。

2)标识符超长

我拿到的SQL SERVER脚本,有些字段名字起的非常长,而oracle只能支持30个字符以内,所以,也要手动修改。

三、执行

好不容易翻译好的脚本,如何执行?

用PLSQL Developer的SQL窗口,只能执行头三条语句;应当用命令窗口。但命令窗口对格式要求又比较严,有时出现一段SQL脚本,断句报错的情况。

还有就是,像这种以END;结束的,一定要另起一行,来个“/”。如:

CREATE OR REPLACE TRIGGER EVSYS_SETUPGUIDE_ID_TRG
BEFORE INSERT
ON EVSYS_SETUPGUIDE
FOR EACH ROW
BEGIN
SELECT EVSYS_SETUPGUIDE_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
/

四、总结

转换工具并非万能,尽量精简之后再进行翻译;翻译之后,还要进行修正。我最终,还是写了一个工具来做这些辅助工作。比如,字段注释,可以在自行开发的工具里使用正则表达式进行自动替换:

--SQL SERVER 的字段注解
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'海啸发生次数' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'HDTJ_FORM_TJ9', @level2type=N'COLUMN', @level2name=N'TSU_TIMES'
--oracle 的字段注解
COMMENT ON COLUMN "PCB_HDDM2"."TJDISTCODE" IS '用于统计的行政区划代码';

替换的正则表达式

EXEC\s+sys\.sp_addextendedproperty\s+@name=N'MS_Description',\s+@value=N'(?<Comment>[^']+)'\s*,\s+@level0type=N'SCHEMA',@level0name=N'dbo',\s+@level1type=N'TABLE',@level1name=N'(?<Table>[^']+)',\s+@level2type=N'COLUMN',@level2name=N'(?<Column>[^']+)'

替换成:
COMMENT ON COLUMN "${Table}"."${Column}" IS '${Comment}';

sql server t-sql脚本转成oracle plsql的更多相关文章

  1. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)

    原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin  update  某个sqlserver的表@dblink名字 .... ...

  2. 在SQL Server 2012中实现CDC for Oracle

    在上篇在SSIS 2012中使用CDC(数据变更捕获)中,介绍了如何在SSIS 2012中使用CDC,本文在此基础上介绍,如何通过Attunity提供的Change Data Capture Desi ...

  3. SQL Server的链接服务器(MySQL、Oracle、Ms_sql、Access、SYBASE)

    原文:SQL Server的链接服务器(MySQL.Oracle.Ms_sql.Access.SYBASE) 一.使用 Microsoft OLE DB Provider For ODBC 链接MyS ...

  4. sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以

    sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以eg: create table p.e_LOG_WebServer ( [BSCFlg] int, ), ) ); sel ...

  5. sql server编写通用脚本自动统计各表数据量心得

    工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...

  6. SQL Server经典sql语句大全(转)

    一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...

  7. 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC

      摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...

  8. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法

    逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...

  9. (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

    本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...

随机推荐

  1. select * from 为什么效率低?

    sql优化有很重要的一项叫做列裁剪(column pruning).如果不考虑索引,sql的执行算法大概分为sort-base和hash-base,不论是哪种,多出来的列都会带来很多无用的计算. “* ...

  2. element-ui 的input组件 @keyup.enter事件的添加办法

    <el-input placeholder="请输入密码" type="password" @keyup.enter.native="login ...

  3. hust 1605 - Gene recombination(bfs+字典树)

    1605 - Gene recombination Time Limit: 2s Memory Limit: 64MB Submissions: 264 Solved: 46 DESCRIPTION ...

  4. BQ25890 charging ic evb 使用注意事項

    Origin : 今天做了一個小實驗, 從 bq25890 spec 可以知道, enable bq25896 充電的功能,有二個條件, 1.CHG_CONFIG bit 需為1. 2.ce pin ...

  5. 关于vsftp所遇问题

    问题:使用ftp工具上传文件时提示 553 Could not create file.错误: 严重文件传输错误解决方法:除了检查ftp服务外,需要使用 getsebool -a|grep ftp, ...

  6. (4)Unity3d镜头

    Input.GetMouseButton()://获取鼠标按钮状态,0-鼠标左键,1-鼠标右键,2-鼠标中键: Input.GetAxis("Mouse X ") //鼠标水平向移 ...

  7. windows下git使用

    一. 下载及安装 下载  git2.14.1 64bit https://git-for-windows.github.io/(官网下载不动) http://download.csdn.net/dow ...

  8. Codeforces Gym 100733I The Cool Monkeys 拆点+最大流

    原题链接:http://codeforces.com/gym/100733/problem/I 题意 有两颗树(只是树,不是数据结构),每棵树上有不同高度的树枝,然后有m只猴子在某棵树的前m高的树枝上 ...

  9. 一些yuv视频下载地址

    因为测试需要下载一些yuv视频地址,现存一个可以下载yuv视频的地址以备后用 http://trace.eas.asu.edu/yuv/index.html ftp://ftp.ldv.e-techn ...

  10. 济南day2

    我好菜啊,绝望啊orzzzzzzz 上午: 上午题解报告 下午 预计100+100+30 实际100+90+0 T2不是我的错,评测机炸了,第一个点无法运行,本机是可以过得 T1 乱搞 T2 前缀和+ ...