设为首页 收藏本站
查看: 907|回复: 0

[经验分享] 应用从Oracle迁移至SQLServer时SQL转换

[复制链接]
YunVN网友  发表于 2016-8-15 07:29:44 |阅读模式
  一、关于SQL标准和扩展
  
  目前主流关系数据库管理系统(包括Oracle和SQLServer)均支持遵守ANSI SQL89标准。
  基于通用SQL标准(ANSI SQL89标准),大部分数据库厂商对SQL语言进行扩展,
  具有较大影响力的SQL扩展有Transact-SQL和PL/SQL
  
  Transact-SQL(T-SQL)
  SQLServer和Sybase Adaptive Server(ASE)系列数据库的SQL语言引擎属于T-SQL;
  但自SQLServer version 4.2后,SQLServer和Sybase对T-SQL支持出现分歧,
  目前已形成Microsoft T-SQL和 Sybase T-SQL两种标准。
  
  PL/SQL(Procedural Language/SQL,过程化SQL语言)
  Oracle的SQL语言引擎属于PL/SQL,MySQL目前不支持 PL/SQL
  
  关于Transact-SQL语言和PL/SQL语言
  同JAVA,C/C++一样,两者属于编程语言;
  可在tiobe编程语言排行榜单查询到(Transact-SQL在第10位,PL/SQL在第23位,2014年10月)
  
  
  二、应用从Oracle迁移至SQLServer
  目前情况是,该应用(某应用)同数据库的所有交互均集中在SQL层面;
  因此,应用的数据库迁移的主要工作是将已存在的PL/SQ标准的SQL转换成Microsoft T-SQL标准的SQL;
  完成这个转换的前提是要清楚上述两种SQL标准的差异。
  
  总结一下,该应用中涉及的两种SQL标准的差异有:
  
  特征项              Microsoft T-SQL                         PL/SQL
  字符连接            使用加号+作为连接符                 使用||符号作为连接符
  外连接                left join和right join                       left join和right join,或者(+)方式                                             
  系统时间            getdate()                                       关键字SYSDATE 
  时间格式化        convert()结合replace()               TO_CHAR()
  根据null取值      isnull()                                          NVL()
  根据条件取值     CASE WHEN语句                       CASE WHEN语句,或者DECODE()
  自动字符填充     REPLICATE()结合right()或left()  RPAD()或LPAD()
  去除前后空字符 ltrim()和rtrim()                               trim()
  字符子串             substring()                                     substr()
  
  两种SQL标准还有其他很多差异,这里只列出该应用涉及的部分。
  
  应用迁移时,sql转换的典型例子
  
  1.取系统当前日期时间,并格式化成yyyymmddhh24miss的字符串
  
  PL/SQL:TO_CHAR(SYSDATE,'yyyymmddhh24miss')
  Microsoft T-SQL:replace(replace(replace(convert(varchar,getdate(),120),'-',''),':',''),' ','')
  
  
  2.对于数值类型的SEQ_NO字段,其值不会超过6位数
  若SEQ_NO为null,则赋值为0,否则取其值
  将SEQ_NO转化为6位数字的字符串,不足6位左边补0
  
  PL/SQL:LPAD(NVL(SEQ_NO, 0), 6, '0')
  Microsoft T-SQL:right(REPLICATE('0', 5)+CONVERT(VARCHAR, isnull(SEQ_NO, 0)), 6)
  
  
  3.对于字符类型的flag字段
  若flag='y',则表达式取值为1
  若flag='n',则表达式取值为0
  其他情况,表达式取值为-1
  
  PL/SQL:DECODE(flag, 'y', 1, 'n',0,0) value
  Microsoft T-SQL(或PL/SQL):(CASE WHEN flag='y' THEN 1 WHEN flag='n' THEN 1 ELSE -1 END) value
  
  
  该应用中,Microsoft T-SQL和PL/SQL都支持的特征项:
  字母小写转换:  LOWER()
  字母大写转换:  UPPER()
  取最小值:  MIN()
  取最大值:  MAX()
  is null条件判断:  select * from tableA where cloumnA is null

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257970-1-1.html 上篇帖子: 45个非常有用的Oracle查询语句分享 下篇帖子: oracle数据库割接解决方案一
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表