批量数据上传(access到sql server。sql server到sql server)
一个服务系统,一般都有两个平台(服务平台,数据加工平台)。数据加工可以单机或者联机操作。这中间涉及到了两个数据整合上传问题。一是定期将单机的数据上传到数据加工平台。二是定期将数据加工平台的数据上传到服务器上。整个上传过程涉及到了两个核心过程:(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)