数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle迁移SQLServer的陷阱


发布日期:2021年12月27日
 
Oracle迁移SQLServer的陷阱
在把Oracle查询转换为SQLServer的时候要特别当心一些不容易注意到的问题我们知道TSQL是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()))

上一篇:用 VC 开 发 Oracle 数 据 库 应 用 程 序

下一篇:Oracle更新操作优化