Home  >  Article  >  Database  >  从oracle迁移到SQLserver的陷阱

从oracle迁移到SQLserver的陷阱

WBOY
WBOYOriginal
2016-06-07 15:13:36968browse

在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题。我们知道,T-SQL是SQL Server的语言引擎,而Oracle的语言引擎却是PLSQL。这两种查询语言都对ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补

在把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只有一行数据,所以常数只返回一次。
中国网管联盟bitsCN.com

  
  Oracle下的DUAL查询如下所示:
  SELECT ‘x’ FROM dual
  
  而对等的SQL Server查询则是下面这个样子:
  SELECT ‘x’ 
  
  连接
  Oracle用|| 符号作为连接符,而SQL Server的连接符是加号:+ 。
  
  Oracle查询如下所示:
  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 网管论坛bbs_bitsCN_com
  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\" 网管下载dl.bitscn.com
  
  日期
  以上两种系统都具有各自的当前日期和时间格式。
  
  Oracle取得日期和采用如下方式:
  SYSDATE
  
  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()))

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn