This Domain(Admin5.com) is for Sale:

从Oracle迁移到SQLServer的陷阱

时间:2007-12-23  来源:不详  作者:迈克DB
在把Oracle查询转换为SQLServer的时候要非凡当心一些不轻易注重到的问题。我们知道,T-SQL是SQLServer的语言引擎,而Oracle的语言引擎却是PLSQL。这两种查询语言都对ANSISQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明,同时还要介绍下如何对这些扩展进行转化以用在SQLServer环境下。
  列的选择

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

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

  Oracle下的DUAL查询如下所示:

  SELECT‘x’FROMdual

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

  SELECT‘x’

  连接

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

  Oracle查询如下所示: 织梦好,好织梦

  Select‘Name’||‘LastName’FromtableName

  对应的SQLServer查询如下所示:

  Select‘Name’ ‘LastName’

  数字取舍

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

  在SQLServer下可以用Round或者Floor。

  以下是Oracle查询:

  SELECTTRUNC(15.79,1)"Truncate"FROMDUAL;

  下面是同类查询的SQLServer版本:

  SELECTROUND(15.79,0)rounded,ROUND(15.79,0,1)truncated
  SELECTFLOOR(ROUND(15.79,0)),FLOOR(ROUND(15.79,0,1))

  数字转换

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

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

  Oracle查询如下:

  SELECTto_char(123.45,99999999999999)fromtab
  SELECTto_char(EXPIRY_DATE,’DDMONYYYY’)fromtab

  以下是SQLServer版本的查询:

  SELECTSTR(123.45,14)

本文来自织梦


  SELECTSTR(round(123.455,2),12,2)
  SELECTCAST(REPLACE((CONVERT(varchar(12),EXPIRYDATE,106)),’’,’’)asvarchar(9))

  LENGTH和LEN

  以下是Oracle的查询:

  SELECTLENGTH(’SQLMAG’)"Lengthincharacters"FROMDUAL;

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

  SELECTLEN(’SQLMAG’)"Lengthincharacters"

  日期

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

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

  SYSDATE

  SQLServer则是这样的:

  GETDATE()

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

  Selectadd_months(sysdate,12)fromdual

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

  Selectdateadd(mm,12,getdate())

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

  SELECTsysdate-add_months(sysdate,12)FROMdual

  SQLServer则是这样做的:

  SELECTdatediff(dd,GetDate(),dateadd(mm,12,getdate()))

看完这篇,您有何感觉呢?

文章评论

共有位Admini5网友发表了评论 查看完整内容

24小时热门信息