sql server t-sql脚本转成oracle plsql
将一份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的更多相关文章
- [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin update 某个sqlserver的表@dblink名字 .... ...
- 在SQL Server 2012中实现CDC for Oracle
在上篇在SSIS 2012中使用CDC(数据变更捕获)中,介绍了如何在SSIS 2012中使用CDC,本文在此基础上介绍,如何通过Attunity提供的Change Data Capture Desi ...
- SQL Server的链接服务器(MySQL、Oracle、Ms_sql、Access、SYBASE)
原文:SQL Server的链接服务器(MySQL.Oracle.Ms_sql.Access.SYBASE) 一.使用 Microsoft OLE DB Provider For ODBC 链接MyS ...
- sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以
sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以eg: create table p.e_LOG_WebServer ( [BSCFlg] int, ), ) ); sel ...
- sql server编写通用脚本自动统计各表数据量心得
工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...
- SQL Server经典sql语句大全(转)
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...
- 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC
摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...
- PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法
逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...
- (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)
本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...
随机推荐
- mybatis如何传入一个list参数
<!-- 7.2 foreach(循环List<String>参数) - 作为where中in的条件 --> <select id="getStudentLi ...
- Java-线索二叉树的实现
概念性的东西,自行百度. 按照国际管理,直接上代码来分析. 1.Node节点类 package com.tree.thread; /** * Author: lihao * Date:2017/8/3 ...
- vue.js源码学习分享(四)
/** * Generate a static keys string from compiler modules.//从编译器生成一个静态键字符串模块. */ function genStaticK ...
- Atcoder CODE FESTIVAL 2017 qual B C - 3 Steps 二分图
题目链接 题意 给定一个无向图,\(n\)个点,\(m\)条边(\(n,m\leq 1e5\)). 重复如下操作: 选择相异的两点u,v满足从点u出发走三条边恰好能到达点v.在这样的u,v点对之间添一 ...
- 使用 new Q_max_capacity 參數,同樣 loading 下,粗估耗電量(UI 上的 %)。
Precondition : 除了 Q_max 外,其它參數皆同. old Q_max_capacity : 1500 mAh new Q_max_capacity : 2200 mAh 有一個 lo ...
- CSS 实践:实现下拉菜单的方法
基于display属性的切换. 将需要不可见的二级菜单ul元素的display元素设为none,当需要可见的时候改为block. .menu ul li ul { display: none; } . ...
- Codeforces 919 B. Perfect Number
B. Perfect Number time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- 高性能内存池NedAlloc
http://www.nedprod.com/programs/portable/nedmalloc/ http://blog.sina.com.cn/s/blog_6f5b220601012x4t. ...
- 简单配置PonyDebugger
OS的Debug 系统在github上还是有不少. PonyDebugger是看上去比较牛气的一个.尝试一下 Logo PonyDebugger 可以监控网络 NetworkTrafficDebugg ...
- 【IntelliJ IDEA】idea显示工具栏
idea显示工具栏 在view->勾选对应按钮即可