审计人员在实施计算机辅助审计时,常常遇到这样的问题:审计人员需要从数据库中几十甚至数百张表中找出有用信息,而一个数据库中很多表是无记录的,如果能先将这一部分的空白表剔除,将大大缩小审计人员查找数据表的范围,提高数据分析的效率。 通过利用SQLServer游标工具、系统表格[sysobjects]、存储过程sp_MSforeachtable等,可以很方便地剔除数据库中的空白表。 方法一:使用SQLServer的[sysobjects]系统表格。数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在[sysobjects]表中占一行,该系统表的字段包括:对象名name、对象类型xtype(U=用户表)等。利用游标的提取功能提取[sysobjects]表中的用户表名,然后对提取的用户表进行判断,如果用户表无记录,则删除该表,具体步骤如下: 第一步,打开SQLServer查询分析器,选择目标数据库。 第二步,定义参数:declare@tbnamevarchar(100) 第三步,定义游标,从数据库中取出用户表名: Declarecur1cursorfor selectnamefromsysobjectswherextype='u' 第四步,打开游标提取用户表名,对用户表进行判断,删除空白表: Opencur1 Fetchnextfromcur1into@tbname While@@fetch_status=0 Begin Exec ('ifnotexists (select*from'+@tbname+')droptable '+@tbname) Fetchnextfromcur1into@tbname 第五步,关闭并释放游标资源: Closecur1 Deallocatecur1 方法二:使用SQL的系统存储过程sp_MSforeachtable实现上述目标。系统存储过程Sp_MSforeachtable可以用来对某个数据库的所有表或某个SQL服务器上的所有数据库进行管理,它包含7个参数: @command1nvarchar(2000),——第一条运行的T-SQL指令 @replacecharnchar(1)=N'?',——指定的占位符号 @co mmand2nvarchar (2000)=null,——第二条运行的T-SQL指令 @command3nvarchar (2000)=null,——第三条运行的T-SQL指令 @whereandnvarchar(2000)=null,——可选条件来选择表 @precommandnvarchar(2000)=null,——在表前执行的指令 @postcommandnvarchar(2000)=null——在表后执行的指令 这里,主要使用参数@command1,具体步骤如下: 第一步,打开SQLServer查询分析器,选择目标数据库。 第二步,执行系统存储过程sp_MSforeachtable语句,删除空白表: Execsp_msforeachtable@command1="ifnotexists (select*from?)droptable?" 其中,“?”类似于在WINDOWS中搜索文件时的通配符。