SQL高阶问题,低手莫入!(100分)

  • 主题发起人 主题发起人 zyzdy
  • 开始时间 开始时间
每天有这么多数据要同步吗?
为什么不考虑SQL SERVER的复制?
 
感谢几众位师兄关注

原因是这样的:

我们公司的业务主系统用的是AS400系统,用户界面、业务程序全是cobol写的。。

而分公司则在业务系统之外要查询很多东西(不可能让分公司通过ODBC上业务系统,效

率低得吓人),并做一些适应的报表(可能每间分公司都不同),所以,我们要把数据

下放到每间分公司去。大体的思路是:

程序A[2]----->SQL Server[3](总公司)---->SQL Server(分公司)(复制)[4]
| | |
| | |(复制)[4]———>SQL server(分公司)
AS400/DB400[1] | |
| |(复制)[4]------->SQL Server(分公司)
|
(复制)[4]SQL Server(分公司)

[1]、[2]、[3]是数据运转路线,我来说明一下:

[A]为什么要写程序A,在业务系统上,是欧洲一家公司在AS400上的专属系统

他不让其它的外部程序及环境调用他底层的DB2/400数据库,(没有使用SQL语言)而从最终

用户的角度来讲,如果通过(ODBC),那么,他只能有select权限,所以,在这一步来讲我

们不可能,也不让使用AS400的复制功能。

业务系统数据量大得异常,现在一家光是北京公司一家就将180G的硬盘占了

20G以上,所以我们的数据并不是全部都下载到SQL 当中的,而是通过程序A下载[其中一部分]

他会每天晚上去将当天的增量数据给复制下来。但是问题就在这里。我们只选择了其中的了部分

数据,所以根据分公司的需要不断增加。。不得不经常性的增加数据列。。而增加数据列下来的数据

就大了(相当于做一次Table初始的同步)。

[C]下来数据列可能最少都有几万列,我们的想法是如何快速将数据装进SQL数据库

然后将增加列的数据表与他以前的表通过关键字关联起来。。我们用View代用Table了,大家知道不可能

去对增加的列的表做update,(系统会累死)。 所以,关键之处就在于如何把增加列的数据

以绝快的速度装进数据库。我也用过BDE、ADO的insert(效率太低),这种方式还有一个问题

就是字符串如[Tab's "Code" to],这种字符串无法装进系统(已解决)。所以,才想到考虑

用原生的ADO来写,这是程序可控制的办法。如果借用外部的办法,如bcp or bluk into之类

在程序控制难度很大,也不方便自动化。。

[D]在使用原生的ADO时,又好像有两种选择一种是使用ADO的OCX,一种是使用ADO的

API来实现。便在CB中使用了原生ADO时,下句话无论如何也要出错。

ADODBS->Recordset->Open(参数)

所以决无办法做ADDNEW的了。。

[E]数据进入总公司的SQL server之后,通过专线(64K或128K)复制到分公司,这一步

我们已做过测试运行良好。

[F]所以问题的关键便在于如何在CB中使用原生的ADDNEW,并结合温柔一刀的思路,我想

问题应能较好的解决。。

[G]感谢大家的帮助。

 

感谢大家的帮助,我对这个问题也是无法可想了,如果大家没有更好办法,

小弟打算过几天就开始送分了。
 
如此大批量的数据传输,为何不考虑数据仓库技术? 有没必要传输明细数据?
 
试试这样:
AQL->Recordset->Open(vNULL,vNULL,ADO::adOpenStatic, ADO::adLockReadOnly,ADO::adCmdUnknown));
看和下面的出错是否一样,确定是否参数有误。
AQL->Recordset->Open(SU,AC,ADO::adOpenStatic, ADO::adLockReadOnly,ADO::adCmdUnknown));
或者
AQL->Recordset->Open("select * from YOUVIEW",AC,ADO::adOpenStatic, ADO::adLockReadOnly,ADO::adCmdUnknown));
AC要先open(..);
 
to:qinghao

Open(vNULL,vNULL,ADO::adOpenStatic, ADO::adLockReadOnly,ADO::adCmdUnknown));
这种方式应是原生的OPen,在CB中OPEN是这样定义的。。

AC->Recordset->Open(ole变量(SQL或表),ole变量(ADO连结),int类型,int类型,int类型)

 
不用那么麻烦。
直接使用query
但sql.text:='insert .....'+#13#10+
.... +#13#10+
'insert .....';
query.execsql;
每次执行处理200条sql,使用BDE+Mssql 比在Sql server中跑,快不止10倍!
 
另:BDE+Mssql 使用的接口是OLE DB接口。
 
同意楼上所说,BDE+MSSQL确实速度不错,比使用ADO+MSSQL速度要快的多
我试过拔号登录远程数据库,其实用BDE查询的速度远远超过用ADO查询的速度
 
我想你的数据量这么大,能不能不要一次性传送,设计一个程序在系统空闲时就开始传送,
当系统忙时就停止,类似于断点续传。复杂一点可以是程序自动控制,简单一点就让操作员自己控制,
这样,就好像愚公移山,一天有24小时呢,假设只空闲12小时也应该足够了吧!
我这里就是将数据量大的工作分别安排在午夜和中午休息时进行的。

 
我一直也在寻找一种能高效率导库的方法,以前是用BDE的BATCHMOVE,但问题是我的程序
是用ADO。后来在SQL SERVER2000找到一个导库的行集函数OPENROWSET(应该说还有几个
行集函数可用),但因为除了SQL SERVER2000的帮助,实在无法找到更多的资料,做为以
存储过程实现的函数应该有比较高的执行效率。但问题是异构数据库的PROVIDER STRING
如果写。
 
强烈建议用微软的数据转换服务: DTS !!!!!
它的效率对Sql server是最高的, 查一查DTS 编程资料吧。
 
多人接受答案了。
 
后退
顶部