网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库。但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普遍需求。

下面将常见的Oracle与SQL SERVER编程差异罗列,并提出解决方案。

1、时间格式的差异

SQL SERVER与Oracle的对时间格式的要求是不同的,SQL SERVER可以直接插入符合条件的字符串作为时间,而Oracle需要经过额外的转换。

SQL SERVER: 创建一张Test表,其中dateTime字段为datetime类型,使用以下语法是可以成功插入数据库的。

insert into test (dateTime) values('2013-10-16 20:34:38')

Oracle: 在相同环境下,执行上述语句会提示“文字与格式字符串不匹配”的错误,我们需要使用to_date将格式转换为Oracle的日期型,修改后sql语句如下。

insert into test (dateTime) values(to_date('2013-10-16 20:34:38','yyyy-mm-dd hh24:mi:ss'))

为了解决时间格式的差异,我们可以通过记录数据库类型来对sql语句进行特殊处理,这一方法可以解决后面的其它差异,在没有其它选择时是一把万能钥匙。

我们换一种思路,在此我们只是需要记录下时间,因此我们可以使用其它格式的数据来记录。比如,使用Unix时间戳。

下面是C#实现Unix时间戳与普通时间间转换的代码:

         /// <summary>
/// Converted Unix timestamp to DateTime time
/// </summary>
/// <param name="argTimeStamp">Unix timestamp</param>
/// <returns>DateTime</returns>
public DateTime GetTime(string argTimeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));
long lTime = long.Parse(argTimeStamp + "");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
} /// <summary>
/// Converted DateTime time to Unix timestamp
/// </summary>
/// <param name="argTime">DateTime</param>
/// <returns>Unix timestamp</returns>
public string ConvertDateTimeInt(DateTime argTime)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));
return (argTime - startTime).TotalSeconds.ToString();
}

  现在,我们可以很方便的使用10位字符型来存储日期类型的数据了。

2、Count函数返回值的差异

在数据库操作中使用 Count 来判断是否存在是很常见的做法,Oracle 与 SQL SERVER 使用 Count 返回的类型不一致,需要通过 Convert.ToInt32 转换查询到的结果。产生这一现象的原因是 SQL SERVER 中的 int 类型在 Oracle 中为 Integer ,因此在涉及整型时将结果使用 Convert.ToInt32 转换。

SQL SERVER 与 Oracle 的类型不匹配还可能发生在使用枚举作为字段时,Oracle会将枚举解释成字符串类型,因此也需要额外的转换。

3、Convert函数的差异

在 SQL SERVER 与 Oracle 使用 Convert 的语法有明显差异。

Ø 将字符型装换为日期型

SQL SERVER:  CONVERT(DATETIME,'20131016',121)

Oracle:  to_date('2013-10-16','yyyy-mm-dd')

Ø 将日期型转换为字符型

SQL SERVER:  CONVERT(CHAR(10),GETDATE(),121)

Oracle:  to_char(sysdate,'yyyy-mm-dd')

4、别名的使用差异

在 SQL SERVER 中可以使用 as 来定义表的别名,Oracle 不支持此用法,在使用别名时需要去掉 as。Oracle 也不支持 SQL SERVER 表使用 dbo.Table 的语法。另外 SQL 语句结尾的 ‘;’ 在Oracle也不被支持。

另一个要注意的是在 Oracle 中如果有使用 union 连接时,Order by 中的列名不能加表的别名,否则会出错。

5、字符串拼接差异

在 SQL SERVER 中可以使用 ‘+’ 来拼接字符串,在 Oracle 中 ‘+’ 仅能数值型字段,字符型可以使用 “||” 或者 concat 函数来实现拼接。

本文SQL语句在 SQL SERVER 2008 和 Oracle 11g 下测试,不保证其它环境下的正确性。

本文来自 NewIdea 的博客,作者 Carey Tzou 。

原文地址:http://www.cnblogs.com/NewIdea/p/sqlbase.html

转载请注明出处,否则拒绝转载!

Oracle与SQL SERVER编程差异分析(入门)的更多相关文章

  1. ORACLE和SQL SERVER的数据同步常用方法

    ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...

  2. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  3. MySQL、Oracle和SQL Server的分页查询语句

    假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...

  4. Datatypes translation between Oracle and SQL Server

    Datatypes translation between Oracle and SQL Server part 1: character, binary strings Datatypes tran ...

  5. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)

    原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin  update  某个sqlserver的表@dblink名字 .... ...

  6. Oracle与SQL Server事务处理的比较

    事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...

  7. InstallShield高级应用--检查是否安装ORACLE或SQL Server

    InstallShield高级应用--检查是否安装ORACLE或SQL Server   实现原理:判断是否存在,是通过查找注册表是否含有相应标识来判断的. 注意:XP与WIN7系统注册表保存方式不一 ...

  8. SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)

    原文:SQL Server审计功能入门:SQL Server审核 (SQL Server Audit) 介绍 Audit是SQL Server 2008之后才有的功能,它能告诉你"谁什么时候 ...

  9. SQL Server审计功能入门:更改跟踪(Change Tracking)

    原文:SQL Server审计功能入门:更改跟踪(Change Tracking) 介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制.常规的,自定义变更跟踪和读取跟踪数据, ...

随机推荐

  1. [Architect] Abp 框架原理解析(3) DynamicFilters

    本节目录 介绍 定义Filter 设置Filter 这是Abp中多租户.软删除.激活\禁用等如此方便的原因 Install-Package EntityFramework.DynamicFilters ...

  2. sql server2008中左连接,右连接,等值连接的区别

    数据库中的连接我了解到有left join,right join,inner join这些,以下是它们的区别: 1)左连接(left join):先取出a表的所有数据,再取出a.b表相匹配的数据 2) ...

  3. csharp:百度翻译

    参考:http://api.fanyi.baidu.com/api/trans/product/index http://developer.baidu.com/wiki/index.php?titl ...

  4. idea中maven项目xml资源文件无法读取

    解决方法:编辑pom.xml文件 添加如下标签 <build> <resources> <resource> <directory>src/main/j ...

  5. git 给远程库 添加多个url地址

     目录[-] 前提 使用流程 原理解析 注意 Other 参考文章 作者:shede333主页:http://my.oschina.net/shede333 && http://blo ...

  6. Linux Shell系列教程之(十三)Shell分支语句case … esac教程

    本文是Linux Shell系列教程的第(十三)篇,更多Linux Shell教程请看:Linux Shell系列教程 分支语句非常实用,基本上高级语言都支持分支语句(python 没有),大多数都使 ...

  7. CentOS 编译安装 MySQL5.7

    下载 所有版本下载地址: http://dev.mysql.com/downloads/mysql/ 此处用 5.7.10 wget http://dev.mysql.com/get/Download ...

  8. 【GPU编解码】GPU硬解码---DXVA

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  9. JavaScript 学习—— js获取行间样式和非行间样式

    1. 问题引入 <head> <style> #div1{ width:150px; height:200px; position:absolute; left:-150px; ...

  10. 初学Node(一)国际惯例HelloWorld

    简介 没有用过Node,记的这些只是学习的笔记,有什么错的地方,望各位前辈指正. Node是一个服务器端Javascript解释器,依赖于Chrome v8引擎进行代码编译,事件驱动.非阻塞I/O都是 ...