在把Oracle查询转换为SQLServer的时候要特别当心一些不容易注意到的问题
我们知道
T
SQL是SQLServer的语言引擎
而Oracle的语言引擎却是PLSQL
这两种查询语言都对ANSISQL
标准进行了扩展以提供额外的支持力度
你所创建的应用程序几乎都要用到这些补充特性
本文就对最常用的
非标准的Oracle扩展进行了说明
同时还要介绍下如何对这些扩展进行转化以用在SQLServer环境下
列的选择
用PLSQL执行数据查询的时候FROM子句是必须的这同SQLServer的要求是一样的SELECT语句必须选择针对的数据表在Oracle数据库内有一种特殊的表DUALDUAL表由Oracle连同数据字典一同创建所有的用户都可以用名称DUAL访问该表这个表里只有一列DUMMY该列定义为VARCHAR()类型有一行值X
从DUAL表选择数据常被用来通过SELECT语句计算常数表达式由于DUAL只有一行数据所以常数只返回一次
Oracle下的DUAL查询如下所示
SELECTxFROMdual
而对等的SQLServer查询则是下面这个样子
SELECTx
连接
Oracle用||符号作为连接符而SQLServer的连接符是加号+
Oracle查询如下所示
SelectName||LastNameFromtableName
对应的SQLServer查询如下所示
SelectName+LastName
数字取捨
Oracle数据库内有一个TRUNC函数该函数返回m位十进制数的n位如果省略m则n就是位m的值可以为负表示截去小数点左边m位数字
在SQLServer下可以用Round或者Floor
以下是Oracle查询
SELECTTRUNC()TruncateFROMDUAL;
下面是同类查询的SQLServer版本
SELECTROUND()roundedROUND()truncated
SELECTFLOOR(ROUND())FLOOR(ROUND())
数字转换
Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR数据类型同时采用可选的数字格式
SQLServer则通过STR函数返回数字转换之后的字符数据不过该函数不具方便的Format参数
Oracle查询如下
SELECTto_char()fromtab
SELECTto_char(EXPIRY_DATEDDMONYYYY)fromtab
以下是SQLServer版本的查询
SELECTSTR()
SELECTSTR(round())
SELECTCAST(REPLACE((CONVERT(varchar()EXPIRYDATE)))asvarchar())
LENGTH和LEN
以下是Oracle的查询
SELECTLENGTH(SQLMAG)LengthincharactersFROMDUAL;
以上查询在SQLServer下是这样写的
SELECTLEN(SQLMAG)Lengthincharacters
日期
以上两种系统都具有各自的当前日期和时间格式
Oracle取得日期和采用如下方式
SYSDATE
SQLServer则是这样的
GETDATE()
你可以用各种语法操作日期以下的代码对Oracle日期值中的月份进行了格式调整(返回日期再加上n月)
Selectadd_months(sysdate)fromdual
SQLServer则是如下完成同等功能的
Selectdateadd(mmgetdate())
数据的减法也不同以下代码在Oracle中直接对数据进行减法操作
SELECTsysdateadd_months(sysdate)FROMdual
SQLServer则是这样做的
SELECTdatediff(ddGetDate()dateadd(mmgetdate()))