我们当中的大部分人工作在一个单一的 RDBMS 系统中,如 MSSQL, Oracle, or IBM DB2。然而,我们日益感觉到,我们正处于不同的数据库环境当中并且需要解决数据的互用性问题。
尽管主要的 RDBMS 厂商试图去遵循关系数据库模型原理,并且用非常小的差异去实现它们。另外,几乎主要的 RDBMS 厂商都遵循 SQL-92 标准。他们仍然有他们自己的对该标准的扩展。例如,Oracle 的 PL/SQL 和 Microsoft 的 T-SQL ,对 ANSI SQL进行了更多的扩展。
通过一系列的文章,我将指明在 SQL Server和 Oracle 之间的数据互用性。我将讨论在两种不同的 RDBMS 中的数据类型。专门的,我将讨论 Oracle 的timestamp 和 SQL Server 的 datetime,在DTS,连接服务器和分布式查询中,它们的互用性可能导致许多问题。
Oracle和 SQL Server 数据类型不同点的概述
绝大部分,Oracle 和 SQL Server 有着兼容的数据类型,尽管它们有着不同的名字,以及精度或比例。例如:Oracle 的CHAR 对应于 SQL Server 的CHAR,但是它们的宽度不同。在 Oracle, CHAR 最大到2000 bytes。在 SQL Server,则可以达到 8000 bytes。SQL Server 的VARCHAR 对应 Oracle 的VARCHAR2。并且它们的宽度是不同的 (Oracle VARCHAR2 4000, SQL Server VARCHAR 8000) 。在数字类型方面也有不同。在 Oracle,几乎只有一个数字类型NUMBER,依靠定义它的精度和比例,它可以匹配 SQL Server 的tinyint, smallint, int, bigint,以及 numeric 数据类型。在 Oracle 中,你可以制作一个序列,它可以匹配 SQL Server 的唯一标识字段。
在二进制数据类型方面,Oracle具有 RAW, LONG RAW,和 BLOB等类型。它们应该能够兼容SQL Server中的 varbinary和 image 数据类型。 我说“应该”,是因为我还没有自己测试过这一点。或许在下一次我可以进行这个工作 。更多的数据类型的细节,请参考 Microsoft SQL Server BOL和 Oracle 的文档。
对于一个Oracle的表,在SQL Server中做一个对应的表,最好的办法是使用 DTS 导入向导生成一个 CREATE TABLE DDL 语句。如果Oracle的表有一个TIMESTAMP 字段,你将面临一些问题,下一节我将指明。
Oracle TIMESTAMP和 Microsoft SQL Server datetime 转换问题
在 Oracle 中,TIMESTAMP 类型使你解析时间的精度是10亿份之一秒。尽管SQL Server 有一个叫timestamp的类型,但是它和SQL-92中的timestamp的定义不同。它的名字使得许多的用户产生误解。典型的,SQL Server的 timestamp数据类型被用于 version-stamping 表的行。然而,它与Oracle中的 timestamp不能匹配。与Oracle中的timestamp最接近的数据类型是SQL Server中的datetime。
在SQL Server中,DATETIME 数据类型具有300分之一秒的精度 (等于3.33 毫秒或 0.00333 秒)。以 .003,或 .007 秒递增。这个矛盾将导致在试图进行DTS数据传输时的问题,或者当你通过连接服务器在Oracle中查询相关的timestamp字段时也会出现问题。
在DTS 中,如果你使用 Microsoft ODBC 驱动,将出现下面的消息提示:
在DTS中,如果你使用 Microsoft OLE DB Provider for Oracle,你将得到下面的提示:
通过下面的步骤,你可以再现这些错误消息:
- 使用DDL在Oracle中建一个表:
create table t1 (c1 varchar2(20), c2 timestamp(3));
注意:timestamp 字段的参数使用要正确,无论你使用何种参数,timestamp数据的变换都将失败。
- 在Oracle的表中插入一些值,例如:
insert into t1 (c1, c2) values ('Hello World', systimestamp); commit;
- 在 SQL Server 企业管理器中,假设你的Oracle客户端已经安装正确,在其他章节可能介绍与此相关内容。在Oracle到SQL Server直接你能够使用DTS designer 并且设计一个数据传输任务。当你想从t1中查询数据的时候,上面的错误提示将出现;
- 现在设计一个链接服务,我可以写一个独立的章节。你可以设计一个查询:
select * from MyLinkedServer..MYSCHEMA.T1.
将获得下面的错误:
Server: Msg 7354, Level 16, State 1, Line 1
OLE DB provider 'MSDAORA' supplied invalid metadata for column 'C2'. The data type is not supported.
OLE DB error trace [Non-interface error: Column 'C2' (ordinal 1) of object '"MYSCHEMA"."T1"' reported an unsupported value for DBTYPE of 13].
- 如果你使用 OpenQuery:
select * from openquery(MyLinkedServer, 'select * from MYSCHEMA.T1')
将获得下面的错误:
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'MSDAORA' reported an error.
[OLE/DB provider returned message: Oracle error occurred, but error message could not be retrieved from Oracle.]
[OLE/DB provider returned message: Data type is not supported.]
OLE DB error trace [OLE/DB Provider 'MSDAORA' ICommandPrepare::Prepare returned 0x80004005: ].
围绕这个问题如何解决呢
为了解决这个问题,你必须转换Oracle的timestamp值以便SQL Server能够接受它。一个方法是,你可以丢掉一些精度,使它接近3毫秒。
对应的 PL/SQL 函数是 TO_CHAR。如果你使用连接服务器,如下的方法进行查询:
select * from openquery(MyLinkedServer, 'select TO_CHAR(systimestamp, ''YYYY-MM-DD HH24:MI:SSXFF3'') from dual')
. 请注意你必须使用OpenQuery。
如果你使用 DTS,有两个方法。第一个方法是在Oracle中设计一个视图view,并且使用 TO_CHAR 去转换 timestamp 的值使得 SQL Server 可以识别。另一个方法是使用SQL语句作为数据源并且在SQL语句中嵌入 TO_CHAR 函数。
结论
在本文中,我描述了在 Oracle和 SQL Server 之间的一些不同点。特别的,我列举了一些处理 Oracle timestamp 值的方法。希望能够帮助你解决数据的互用性问题。
<!--
google_ad_client = "pub-2416224910262877";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "image";
google_ad_channel = "";
// -->
分享到:
相关推荐
基于信道互易性的波束成形 基于信道互易性的波束成形 基于信道互易性的波束成形 基于信道互易性的波束成形
网络互易性研究
基于时空调制的频率可重构非互易性滤波器.docx
网络互易性研究.ms9
互易性条件下的极化检测算法_roc_极化目标检测_极化检测_互易性_极化检测.zip
互易性条件下的极化检测算法_roc_极化目标检测_极化检测_互易性_极化检测_源码.zip
从换能器的互易原理出发,利用平面波自易校准法获得换能器的自由场发送电流响应。根据平面活塞型换能器的衍射规律,推导出声发射功率的表达式。由此计算互易换能器在给定驱动电流或电压作用下的辐射超声功率。
行业资料-电子功用-基于互易性原理的粗糙面与目标复合电磁散射仿真方法
电路中关于互易定理的内容 详细的介绍关于互易定理的构成,结构
基于信道互易性的波束成形全解PPT学习教案.pptx
基于互易性理论的体扰动法在随机粗糙面电磁散射中的应用,王蕊,郭立新,本文利用体扰动互易性理论(Volumetric-Perturbative Reciprocal Theory, VPRT)研究了一维随机粗糙面的电磁散射。将互易性理论和体扰动方法相...
泛应用于微波技术领域[ 1- 3] , 而整个传输线一旦具 有非互易的性质, 即正向和反向的传输参数不同, 其 描述方程的参数也将变得复杂, 给实际的工程设计 造成困难. 2003 年, 文献[ 4] 提出了广义Smith 圆图 (GSC) , 一...
Massive MIMO系统中I/Q不平衡的信道互易性校准算法研究,崔晋铭,李书芳,Massive MIMO系统中利用发射端信道状态信息(CSI),对发送数据进行预处理,可以有效减小干扰并提升Massive MIMO系统容量。在实际传输过程
房屋互易契约书1.zip
提出了在三腔光力学系统中实现非互易性的理论方案。三个被强驱动光场驱动的光学腔场通过辐射压力分别与一个机械振子耦合,其中两个光学腔场通过光纤耦合在一起的同时还被弱探测光场驱动。基于海森堡-朗之万方程给出了...
房屋互易契约书1.doc
本文在利用TDD信道互易性的基础上,针对现有LTE帧结构2,提出了基于MMSE(最小均方误差)的线性信道预测模型,同时,对在不同移动速度下单帧递推信道预测及多帧递推信道预测的性能进行了仿真和对比。
为了实现光的非互易性传输,在一维光子晶体中插入两个非对称的金属磁性材料缺陷层。插入的金属磁性材料在光子晶体中形成了不对称的磁性微腔。运用适用于磁光材料的传输矩阵方法研究结构的传输特性。由于金属磁性材料...
通过Rsoft软件对锥形光纤倏逝场能量分布特性进行仿真,从理论上分析锥形光纤激发微谐振腔非互易性产生的原因。...通过计算微球腔理论鉴频曲线获得非互易性对陀螺动态范围与灵敏度的影响,并提出抑制方法。