一个服务系统,一般都有两个平台(服务平台,数据加工平台)。数据加工可以单机或者联机操作。这中间涉及到了两个数据整合上传问题。一是定期将单机的数据上传到数据加工平台。二是定期将数据加工平台的数据上传到服务器上。整个上传过程涉及到了两个核心过程:(1):怎样判断该数据是否上传(2) 主表上传后,如果主表主键发生改变,怎样让子表的外键也相应的改变。 本文中数据加工以access数据库为基础的,包括单机版,网络版(通过odbc连在sql1上)。服务平台建在sql2上。程序由存储过程完成。用OPENROWSET来调用access。以下简单谈下我对这两个核心问题的解决思路。 一. 上传前,如果对表建立了关系,必须先禁用约束。 set @sql='declare #tbc cursor for select name,tbname=object_name(parent_obj) from '+@n_dbname+'..sysobjects where xtype in(''C'',''F'')' exec(@sql) declare @name sysname,@tbname sysname open #tbc fetch next from #tbc into @name,@tbname while @@fetch_status=0 begin set @sql='alter table '+@n_dbname+'..['+@tbname+'] NOCHECK CONSTRAINT ['+@name+']' exec(@sql) fetch next from #tbc into @name,@tbname end close #tbc 完成后恢复约束 open #tbc fetch next from #tbc into @name,@tbname while @@fetch_status=0 begin set @sql='alter table '+@n_dbname+'..['+@tbname+'] CHECK CONSTRAINT ['+@name+']' exec(@sql) fetch next from #tbc into @name,@tbname end close #tbc deallocate #tbc 二. 怎样判断表中的数据是否上传。设计表时不可能对每个表加上一个字段来标识是否已上传,只要对主表加个字段标识是否上传,然后通过游标,由关系找出主表下每个表的相关记录,依次上传。不过这样速度会降低,没办法的事拉~~~ 三. 由于数据加工中为了方便输入,对很多表都是以自动编号来标识的。上传后,很多主表的主键必发生相应的改变,这就要求子表的外键值必须发生改变与之对应。 基本思路:先上传主表,然后将子表中的相关记录提出放在临时表中,更新外键,再将临时表上传。(对复杂关系,需对主表建立一个新旧id对应表) 只能借用临时表来更新,如果直接在子表更新,会同时把已经上传的数据更新。 (只谈思路cdfuwu@163.com) |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-30 01:38 , Processed in 0.147140 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.