游标批量汉化表的方法

作 者:
高源 

作者简介:
高源,仙桃市审计局

原文出处:
审计月刊

内容提要:


期刊代号:V3
分类名称:审计文摘
复印期号:2014 年 12 期

关 键 词:

字号:

      在MS SQLSERVER数据库中,游标能从包括多条数据记录的结果集中每次提取一条记录,也能使应用程序对查询语select返回的行结果集中每一行进行批量操作。合理运用数据库内置系统表、存储过程及游标对被审计单位数据库结构进行批量汉化,能快速提高审计人员对原始数据库的理解,从而提高审计分析速度。本文以某一业务数据库为例,介绍利用游标对表进行批量汉化的方法。

      步骤一:分析被审计单位有效用户表。审计人员取得被审计单位原始数据库后,利用系统表sysobjects、sysindexes、syscolumns及行数字段rowcnt取得有效用户表原始表名及列名,查询语句如下:

      USE PLHH

      select o.name as原始表名,c.name as原始列名from sysobjects o join sysindexes i on o.id=i.id and xtype='u' join syscolumnsc on c.id=o.id and i.rowcnt>0

      order by 1

      查询结果:

      

      原数据库部分表结构如下:

      

      步骤二:获取被审计单位数据库对应数据字典表。采集被审计单位数据库时,原数据库中如果没有数据字典表,审计人员应主动与被审计单位沟通取得数据字典表。

      本例子数据字典表如下:select*from FEILDMANGER order by 1

      

      步骤三:运用双层游标及系统内置存储过程,对照数据字典表对原始表结构进行批量汉化。在双层游标中调用sp_rename存储过程批量汉化表名及列名,游标具体如下。

      declare cl cursor for

      定义存放原始表名的游标:

      select o.name as old_tabname from sysobjects o join sysindexesi on

      o.id=i.id and xtype='u'

      and i.rowcnt>0

      open c1

      declare @old_tabname varchar(100)

      fetch cl into @old_tabname

      while @@FETCH_STATUS=0

      begin

      if @old tabname in(select distinct TABEL NAME from FEILDMANGER)

      begin

      declare @new tabname varchar(100)select distinct @new_tabname=tabs from FEILDMANGER where tabel_name=@old_tabname

      批量汉化表名:

      exec sp_rename@old_tabname,@new tabname

      declare c2 cursor for

      定义存储原始列名的游标:

      select c.name as old_colname from sysobjects o join syscolumnsc on c.id=o.id and o.name=@new_tabname

      open c2

      declare @old_colname varchar(100)

      fetch c2 into @old_colname

      while @@FETCH_STATUS=0

      begin

      if @ old colname in(select field_namefrom FEILDMANGER where tabs=@new_tabname)

      begin

      declare@new_colname varchar(100),

      @replace_colname varchar(100)

      select@new_colname=FIELDMS from FEILDMANGER where TABS=@new_tabname and FIELD_NAME=@old_colname

      set@replace_colname=@new tabname+'.'+@old_colname

      批量汉化列名:

      exec sp_rename@replace_colname,@new colname,‘COLUMN’

      fetch c2 into@old colname

相关文章: