巧用SQL剔除数据库空白表“两招”

作 者:

作者简介:
张恒芳,江苏省扬州市江都区审计局

原文出处:
审计月刊

内容提要:


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

关 键 词:

字号:

      审计人员在实施计算机辅助审计时,常常遇到这样的问题:审计人员需要从数据库中几十甚至数百张表中找出有用信息,而一个数据库中很多表是无记录的,如果能先将这些空白表剔除,将大大缩小审计人员查找数据表的范围,提高数据分析的效率。

      通过利用SQL Server游标工具、系统表格[sysobjects]、存储过程sp_MSforeachtable等,可以很方便地剔除数据库中的空白表。

      方法一:使用SQL Server的[sysobjects]系统表格。数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在[sysobjects]表中占一行,该系统表的字段包括:对象名name、对象类型xtype(U=用户表)等。利用游标的提取功能提取[sysobjjects]表中的用户表名,然后对提取的用户表进行判断,如果用户表无记录,则删除该表,具体步骤如下:

      第一步,打开SQL Server查询分析器,选择目标数据库。

      第二步,定义参数:declare@tbname varchar(100)

      第三步,定义游标,从数据库中取出用户表名:

      Declare curl cursor for

      select name from sysobjects where xtype=’u’

      第四步,打开游标提取用户表名,对用户表进行判断,删除空白表:

      Open curl

      Fetch next from curl into @tbname

      While @@fetch_status=0

      Begin

      Exec(’if not exists(select * from’+@tbname+)drop table’+@tbname)

      Fetch next from curl into @tbname

      End

      第五步,关闭并释放游标资源:

      Close curl

      Deallocate curl

      方法二:使用SQL的系统存储过程sp_MSforeachtable实现上述目标。系统存储过程Sp_MSforeachtable可以用来对某个数据库的所有表或某个SQL服务器上的所有数据库进行管理,它包含7个参数:

      @command1 nvarchar(2000),——第一条运行的T-SQL指令

      @replacechar nchar(1)=N’?',——指定的占位符号

      @command2 nvarchar(2000)=null,——第二条运行的TSQL指令

      @command3 nvarchar(2000)=null,——第三条运行的TSQL指令

      @whereand nvarchar(2000)=null,——可选条件来选择表

      @precommand nvarchar(2000)=null,——在表前执行的指令

      @postcommand nvarchar(2000)=null——在表后执行的指令

      这里,主要使用参数@command1,具体步骤如下:

      第一步,打开SQL Server查询分析器,选择目标数据库。

      第二步,执行系统存储过程sp_MSforeachtable语句,删除空白表:

      Exec sp_msforeachtable @commandl=”if not exists(select*from?)drop table?”

      其中,“?”类似于在WINDOWS中搜索文件时的通配符。

相关文章: