在日常审计工作中,上级审计机关经常会遇到需要汇总下级单位报送数据库的问题。如保障性安居工程审计中,每个县市区都报送有来自5个部门的数据库,每个数据库中又包含若干张数据表。将本地区几十个数据库中的上百张数据表汇总到同一个数据库的不同数据表中,这本身就是一件非常麻烦的工作;而数据汇总和审核过程中又存在多次修正并重新报送数据的情况,致使数据汇总操作反复多次执行、工作量呈几何级数增长。如果逐个执行数据导入操作既容易出错,效率也不高。为解决这个问题,审计人员巧用游标编写了一段程序来实现大量数据库文件的自动汇总,大大提高了数据汇总的工作效率。 该方法的设计思想是先建立一个中间表用于统计需要汇总的数据表名称,再搜索系统中所有需要汇总的数据库及数据表并将检索结果存入中间表,最后按中间表中记录的表名称自动将各地数据库中的数据分门别类写入到汇总库中不同的数据表之中。以保障性安居工程数据汇总为例,具体实现方法如下: 首先,需要将各地报送的数据全部附加到服务器上,并建立全市汇总数据库。保障性安居工程审计中,每个地区报送的数据中都有来自财政、医保、房管、不动产、住建5个部门的数据库,每个数据库中又分别包括了不同的数据表。相对应的,也需要建立5个全市汇总数据库及相应的数据表。 其次,建立一个名为“数据库统计表”的中间表,用于存放搜索结果。根据系统中数据库名称的关键字,查询出所有需要汇总的数据库名称和其包含的数据表名称,并将结果存入“数据库统计表”中。 use xx IF EXISTS(SELECT*FROM sysobjects WHERE id=OBJECT_ID(N'[数据库统计表]')AND type in(N‘U'))DROP TABLE[数据库统计表] create table数据库统计表(dataname varchar(100),tablename varchar(200)) declare @dataname varchar(60) declare @sjly int declare @sql1 varchar(100) declare c1 cursor for select a.name from sys.databases a where a.name like‘%标准%’and a.name not like‘%汇总%’ open c1 fetch next from c1 into @dataname while @@FETCH_STATUS=0 begin exec(‘insert into数据库统计表(dataname,tablename)select“‘+@dataname+’”,name from’+@dataname+'.sys.objects where type="U”') fetch next from c1 into @dataname close c1 deallocate c1 然后,遍历检索“数据库统计表”中记载的所有数据库及数据表,并执行数据插入操作,将所有需要汇总的数据,分门别类写入不同数据库的不同数据表之中。 declare @dataname varchar(220) declare @tablename varchar(200) declare @sql varchar(1000) declare c2 cursor for select dataname,tablename from数据库统计表order by dataname,tablename open c2 fetch next from c2 into @dataname,@tablename while @@FETCH_STATUS=0 begin if CHARINDEX(‘不动产’,@tablename)=1 begin set @sql=‘insert into襄阳市-汇总库-不动产部门审计标准库_420600.dbo.不动产登记信息select*from’+@dataname+‘.dbo.’+@tablename print(@sql) exec(@sql) else if CHARINDEX(‘财政供养人员’,@tablename)=1 begin set @sql=‘insert into襄阳市-汇总库-财政部门审计标准库_420600.dbo.财政供养人员信息表select*from’+@dataname+‘.dbo.’+@tablename print(@sql) exec(@sql) else if CHARINDEX(‘房产备案’,@tablename)=1 begin set@sql=‘insert into襄阳市-汇总库-房管部门审计标准库_420600.dbo.房产备案信息select*from'+@dataname+‘.dbo.’+@tablename