站内搜索:
免费注册 登陆     
您现在的位置:TT数据库 > 技巧 > SQL Server 2005与Oracle同步 注意NUMBER类型转换
SQL Server 2005与Oracle同步 注意NUMBER类型转换
2008-7-24   | |

   我们可以使用同义词在SQL Server 2005下连接Oracle来实时访问Oracle数据库,但是如果Oracle中的表数据流较大则会影响应用系统的性能,于是应采用数据库作业每天定时执行:


 drop table abc--删除旧表 
  go 
  select * into abc 

  from aaa--aaa为同义词这样就可以把Oracle中的数据同步到本地的SQL Server数据库中。从而解决跨实例查询的性能问题。

  使用这样的方式半年了都没有发现有什么问题,可是最近却发现了一个现象,在Oracle中有一个表aaa,其中一个字段BILL NUMBER类型(未指定精度和小数数据位),对于这种类型,SQL Server2005中同步的表abc中却被定义为nvarchar(384)的类型!?明明是一个数字类型为什么SQL Server会将其转换为字符串类型呢?

  若只是数据类型改变了倒没有什么,我应用程序在处理时转换一下就是了,但是更奇怪的是其中某些数据在Oracle中查出来是12.34567,但是在SQL Server 2005中查出来却成了12.345670543574563452346547546234234543656434...,后面是几十位的小数,简直神奇了!有一行数据在Oracle中是1,而在SQL Server中查出来是0.99999999999999999999999999999999...但是这种数据也很少发生,在数万条数据中可以找到2-3条这种几十位小数的数据。

  正是这种数据的存在使得应用程序有时算出来的结果和Oracle那边的系统算出来的结果无法匹配。

  经测试,如果Oracle中指定了NUMBER类型的精度和小数位数比如NUMBER(15)这样SQL Server将可以自动将其转换为numeric(15,0)类型。

  由于NUMBER类型可以表示1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0} 之间的数据,精确度可以达到小数点后38位小数,由于SQL Server中没有如此高精度的数据类型,所以在没有指定NUMBER精度和小数位的情况下SQL Server会将其转换为字符串类型以满足长度和精度的需要。

  解决办法就是将SQL Server中同步表的nvarchar(384)类型修改为decimal类型或numeric类型,同步时不删除表,只是清除表内容,然后插入数据。同步SQL为:

truncate TABLE abc--清除表abc内容 
  go 
  insert into abc--将同义词aaa中的数据插入abc表 
  select * 

 原文出处:http://www.cnblogs.com/studyzy/archive/2007/12/26/1016044.html
 来源:BLOG    作者:深蓝    
相关的新闻
"武汉大学—ORACLE空间数据库创新研究中心"近日在武汉大学正式成立。该创新研究中心将针对中国空间信息技术产品巨大的市场需求,通过双方在空间信息技术和人才培养……
 
相关的技巧
Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用。从产品上说,分区技术是Oracle企业版中独立收费的一个组件。以下是对于……
相关的专家答疑
赋予PUBLIC权限更加简单,但也更加危险。对于数据库安全,有一个惯例就是只将权限赋予给需要它们的用户。此外,你只能让用户执行最小的命令。
 
相关的白皮书
Oracle Database 10g的推出,进一步拉大了用于Linux、Unix和Windows的IBM DB2 UDB v8.1在这一领域的技术差距。就性能、扩展能力、扩展力、可用性、安全性以及价格而言……
随着SQL Server数据库的填充和持续的数据增长,以及用户对于次秒级响应时间的期望,避免编写糟糕的查询就是至关重要的了。那么常见的需要避免的查询设计错误都有哪些?
你有没有想过要限制特殊或一般的IP地址能访问你的Oracle数据库呢?具体方法为:首先,你必须创建一个文件,文件名为protocol.ora,创建方法如下……
我们公司里的开发者要求访问数据库,但是我不想让他们访问。相反,我用SQL*Plus HTML的生成功能为开发人员生成Web页面,并且调出了他们所需要的信息。我认为……
赋予PUBLIC权限更加简单,但也更加危险。对于数据库安全,有一个惯例就是只将权限赋予给需要它们的用户。此外,你只能让用户执行最小的命令。
在Oracle里有没有一种方法能限制用户在应用层执行一般操作,如insert、delete、drop等(也就是用户一查询,就能SQL*Plus里限制他,不让他访问数据库)?
使用一门新技术有时候是属于被迫的。没有正确地安装这个技术只会导致更多的困难。这篇指南列出了正确安装SQL Server 2005报告服务的步骤,以及让你走上正确
作为Oracle E-Business Suite的初学者,应该从哪一部分开始学习?是Oracle Financials还是Oracle M
在上一个技术专题中我们提到了数据库安全,本篇继续介绍数据库安全的内容,包括如何限制用户的访问权限,并详细阐述了有关如何限制单一用户的访问权限、限制多个用户的访问权限、确保不同用户的
最新更新
专家答疑
技巧
Brian Peasland
我丢失了pupbld.sql文件.我该如何得到这个文件来创建一个Oracle 10g数据库呢?创建一个Oracle 10g数据库并不需要这个文件。这个文件是用于创建可选……。
Brian Peasland
我想要在我们的Oracle 11i ERP环境中安装一些新的模块。我可以得到一些有关每个并发用户的内存需求的统计数据吗?
Dan Norris
如果我必须从Unix移动到Windows,那么移动涉及的步骤是哪些呢?我所知道的惟一方式就是将Unix下的整个数据库导出,预先创建Windows下的数据库,数据文件,表空间和用户……
TechTarget中国旗下网站群
All Rights Reserved, Copyright 2008, TechTarget中国
TechTarget中国