好学IT学院:IT信息技术分享交流平台
来源:互联网  作者:本站整理  发布时间:2009-11-25  ★★★加入收藏〗〖手机版
摘要:关于如何把数据库里所有表的记录数都统计出来的问题?以前我曾经试着写过一个存储过程,作用就是删除所有表的内容,思路是这样的:…

后来我又去上网搜索其他统计数据库所有表记录数的语句,发现了下面的方法:

create table #(id int identity ,tblname varchar(50),num int)
declare @name varchar(30)
declare roy cursor for select name from sysobjects where xtype='U'
open roy
fetch next from roy into @name
while @@fetch_status=0
begin
declare @i int
declare @sql nvarchar(1000)
set @sql='select @n=count(1) from '+@name
exec sp_executesql @sql,N'@n int output',@i output
insert into # select @name,@I
fetch next from roy into @name
end
close roy
deallocate roy
select * from #
 
  该方法用到了游标,如果数据库表很多的话速度可能会比较慢,但是该表不受表名长短影响,对所有数据库都适用.

第三种方法,利用系统的对象表和索引表:

set nocount on
if object_id(N'tempdb.db.#temp') is not null
  drop table #temp
create table #temp (name sysname,count numeric(18))

insert into #temp
select o.name,i.rows
from sysobjects o,sysindexes i 
where o.id=i.id and o.Xtype='U' and i.indid<2

select count(count) 总表数,sum(count) 总记录数 from #temp
select * from #temp
set nocount off

该方法执行速度绝对最快,但是结果好象并不是太准确,稍微有一些偏差.所以如果对数据量比较大而且对统计结果要求比较低的,该方法绝对是第一选择.如果要求统计绝对准确的记录数而且表的数量比较多的话,个人感觉第一个方法应该是个不错的选择.

第三个方法主要是利用了系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点.

最后一种方法是利用隐藏未公开的系统存储过程sp_MSforeachtable

CREATE TABLE #temp (TableName VARCHAR (255), RowCnt INT)
EXEC sp_MSforeachtable 'INSERT INTO #temp SELECT ''?'', COUNT(*) FROM ?'
SELECT TableName, RowCnt FROM #temp ORDER BY TableName
DROP TABLE #temp

从mssql6.5开始,微软提供了两个不公开,非常有用的系统存储过程sp_MSforeachtable和sp_MSforeachdb,用于遍历某个数据库的每个表和遍历DBMS管理下的每个数据库。

sp_MSforeachtable和sp_MSforeachdb 的用法:http://blog.csdn.net/minisunny/archive/2007/09/20/1793046.aspx

微软SQL Server 2008数据库最新版功能介绍
  现今数据的世界里,公司要获得成功和不断发展,他们需要定位了主要的数据趋势的愿景。微软的这个数据平台愿景帮助公司满足这些数据爆炸和下…
  • 好学考试H5触屏版开放内测
  • 好学触屏公众号虎力全开、杨帆起航!