博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用于查询当前数据库中所有表格的记录条数的脚本
阅读量:5328 次
发布时间:2019-06-14

本文共 2602 字,大约阅读时间需要 8 分钟。

在 进行计算机审计的过程中对于从被审计单位全库拷贝或导出的数据我们可以通过DTS工具导入SQL SERVER 2000中进行分析,但是面对几百张甚至上千张数据表如何知道哪些表有用哪些表无用呢?其中要做的一个例行的检查就是检查数据表中是否包含数据以及包含多 少数据。以下是我收集到的一些相关脚本,运用这些脚本可以让审计人员迅速地了解数据库情况,缩小分析范围。为了让普通审计人员理解脚本的含义,我为脚本作 了注释和点评。

  方法一:

SELECT o.name AS " Table Name", i.rowcnt AS "Row Count " FROM sysobjects o, sysindexes i --检索系统对象表和系统索引表 WHERE i.id = o.id AND i.indid IN ( 0 , 1 ) AND o.xtype = 'u' --系统对象表的xtype为'u'值,表示对应的表为用户表而不包括系统表。这里表示只统计用户表。 AND o.name <> 'sysdiagrams' ORDER BY i.rowcnt DESC --按行降序排序 COMPUTE SUM (i.rowcnt), count (o.name); --汇总行数,表数 GO

点评:该方法关联了系统对象表(sysobjects)和系统索引表(sysindexes),利用系统对象表选择所有用户表进行操作,把系统索引表中系统自动为每张表生成的行计数(rowcnt)作 为查询结果,方法简单实用,突出了对数据库系统表的应用。直接把行计数值作为结果在某种情况下会存在误差(关于这方面的讨论在网上或联机丛书中都很容易找 到),可以用DBCC UPDATEUSAGE语句消除该误差。不过对于审计应用来说,从简单出发,我们完全可以忽略这点误差。

  方法二:源自: ()

--创建一张表格TableSpace用于存储查询得到的用户表情况 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TableSpace]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[TableSpace] go create table TableSpace ( TableName varchar(20), RowsCount char(11), Reserved varchar(18), Data varchar(18), Index_size varchar(18), Unused varchar(18) ) go declare @sql varchar(500) declare @TableName varchar(20) --定义一个游标用于检索所有的用户表 declare Cursor1 Cursor for select name from sysobjects where xtype='U' open Cursor1 fetch next from Cursor1 into @TableName while @@fetch_status = 0 begin set @sql = 'insert into TableSpace ' set @sql = @sql + ' exec sp_spaceused '''+ @TableName + ''' ' --利用系统存储过程sp_spaceused 得到用户表的详细情况 exec (@sql) fetch next from Cursor1 into @TableName end close Cursor1 deallocate Cursor1 go --显示结果 select * from TableSpace --order by TableName --order by TableName ASC --按表名称,用于统计表 --order by RowsCount DESC --按行数量,用于查看表行数 --order by Reserved DESC, Data DESC --按占用空间 --order by Index_size DESC, Reserved DESC --按索引空间查看 go--查看库的使用状况,可以随时执行的。 --exec sp_spaceused --go

点 评:该方法主要运用了系统存储过程 sp_spaceused 和游标。sp_spaceused 中运用的原理实际上就是方法一,只不过sp_spaceused 只显示一张指定表的情况,因此存在的误差和解决方法也和方法一相同。使用游标主要是为了配合sp_spaceused 检索所有用户表的情况。运用方法二可以得到表格的更多的信息,也是不错的方法。

方法三:

exec sp_msforeachtable "exec sp_spaceused '?'"

点 评:该方法只有一行语句,综合运用了sp_msforeachtable 和sp_spaceused 两个系统存储过程,确实简洁。不过sp_msforeachtable 是SQL SERVER 2000中没有正式公开的存储过程,所谓没有正式公开是说,这个存储过程是微软公司在SQL SERVER 2000中自己使用的内部存储过程,因此该存储过程在微软公司今后的产品中是否还保留或者使用方法是否发生变化微软公司都不会通知用户,在联机丛书中也查 不到该存储过程。因此我们在使用方法三时要注意SQL SERVER的版本,先做一下试验,在某些版本中也许并不能使用这个存储过程。当然,本方法也存在方法一、二中提到的误差问题。

方法四:

exec sp_msforeachtable 'select N''?'', count(*) from ?'

点评:基于方法三自然可以想到本方法,本方法避免了使用sp_spaceused 存储过程,自然避免了上述三种方法中误差,不过由于不是直接从系统表中取值,所以计算时间要长一些。

转载于:https://www.cnblogs.com/fuqiang88/p/4346466.html

你可能感兴趣的文章
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
Linux设置环境变量的方法
查看>>