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