从Oracle迁移到SQL Server的陷阱

凤城大鑫

凤城大鑫

2016-02-19 19:47

今天图老师小编要向大家分享个从Oracle迁移到SQL Server的陷阱教程,过程简单易学,相信聪明的你一定能轻松get!

  在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道,T-SQL是SQL Server的语言引擎,而Oracle的语言引擎却是PLSQL。这两种查询语言都对ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明,同时还要介绍下如何对这些扩展进行转化以用在SQL Server环境下。

  列的选择

  用PLSQL执行数据查询的时候,FROM子句是必须的,这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL。DUAL表由Oracle连同数据字典一同创建,所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY,该列定义为VARCHAR2(1)类型,有一行值X。

  从DUAL表选择数据常被用来通过SELECT语句计算常数表达式,由于DUAL只有一行数据,所以常数只返回一次。

  Oracle下的DUAL查询如下所示:

  SELECT ‘x’ FROM dual

  而对等的SQL Server查询则是下面这个样子:

  SELECT ‘x’

  连接

  Oracle用|| 符号作为连接符,而SQL Server的连接符是加号:+ 。

  Oracle查询如下所示:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  Select ‘Name’ || ‘Last Name’ From tableName

  对应的SQL Server查询如下所示:

  Select ‘Name’ + ‘Last Name’

  数字取舍

  Oracle数据库内有一个TRUNC函数,该函数返回m位十进制数的n位;如果省略m则n就是0位。m的值可以为负,表示截去小数点左边m位数字。

  在SQL Server下可以用Round或者Floor。

  以下是Oracle查询:

  SELECT TRUNC(15.79,1) "Truncate" FROM DUAL;

  下面是同类查询的SQL Server版本:

  SELECT ROUND(15.79, 0) rounded , ROUND(15.79, 0,1) truncated
  SELECT FLOOR(ROUND(15.79, 0)), FLOOR(ROUND(15.79, 0,1) )

  数字转换

  Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型,同时采用可选的数字格式。

  SQL Server则通过STR函数返回数字转换之后的字符数据。不过,该函数不具方便的Format参数。

  Oracle查询如下:

  SELECT to_char(123.45 ,99999999999999) from tab
  SELECT to_char(EXPIRY_DATE,'DDMONYYYY') from tab

  以下是SQL Server版本的查询:

  SELECT STR(123.45, 14)
  SELECT STR(round(123.455 , 2),12,2)
  SELECT CAST(REPLACE((CONVERT(varchar(12) , EXPIRYDATE, 106 )),' ' , '') as varchar(9))

  LENGTH和LEN

  以下是Oracle的查询:

  SELECT LENGTH('SQLMAG') "Length in characters" FROM DUAL;

  以上查询在SQL Server下是这样写的:

  SELECT LEN('SQLMAG') "Length in characters"

  日期

  以上两种系统都具有各自的当前日期和时间格式。

  Oracle取得日期和采用如下方式:

  SYSDATE

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  SQL Server则是这样的:

  GETDATE()

  你可以用各种语法操作日期。以下的代码对Oracle日期值中的月份进行了格式调整(返回日期再加上n月):

  Select add_months(sysdate,12) from dual

  SQL Server则是如下完成同等功能的:

  Select dateadd(mm,12,getdate())

  数据的减法也不同。以下代码在Oracle中直接对数据进行减法操作:

  SELECT sysdate -add_months(sysdate,12) FROM dual

  SQL Server则是这样做的:

  SELECT datediff(dd, GetDate(),dateadd(mm,12,getdate()))

  小结

  幸而,我在从Oracle迁移到SQL Server 2000的过程中并没有遭遇太棘手的问题。当然,一开始我就深知系统之间肯定存在显著的差异。我希望本文列出的差别有助于你避免一些常见的问题。

展开更多 50%)
分享

猜你喜欢

从Oracle迁移到SQL Server的陷阱

编程语言 网络编程
从Oracle迁移到SQL Server的陷阱

将应用程序从Sql Server迁移到Oracle

编程语言 网络编程
将应用程序从Sql Server迁移到Oracle

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

数据从MySQL迁移到 Oracle的注意事项

编程语言 网络编程
数据从MySQL迁移到 Oracle的注意事项

.NET框架下Oracle到SQL Server迁移

Web开发
.NET框架下Oracle到SQL Server迁移

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

SQL Server 7.0 的数据迁移到MySQL上的一种方法

SQLServer
SQL Server 7.0 的数据迁移到MySQL上的一种方法

Access2000迁移到Oracle9i要点

电脑网络
Access2000迁移到Oracle9i要点

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Oracle时间格式讨论

Oracle时间格式讨论

谢谢你陪我的那些路,至少你我都记得很清楚.

谢谢你陪我的那些路,至少你我都记得很清楚.
下拉加载更多内容 ↓