关于在SQL Server中统计所有表的记录数的三个方法
关于如何把数据库里所有表的记录数都统计出来的问题?以前我曾经试着写过一个存储过程,作用就是删除所有表的内容,思路是这样的:
首先通过sysobjects表构造一个sql语句字符串'DELETE 表名',其中表名就是sysobjects中的name列,把这些DELETE语句字符串连接起来的方法一是通过游标,二则是直接利用如下语句:
select @sql = @sql + 'DELETE ' + name from sysobjects where xtype='U';
这是一个很有用的技巧,在合适的地方用会很大程度的优化语句运行速度.
然后就是通过exec(@sql)执行该字符串.
而把数据库所有表的记录数统计出来和这个思路几乎完全一样,不同的就是把'DELETE 表名' 改为'SELECT 表名,COUNT(1) FROM 表名',主要这点不同而已,如果构造完字符串并执行完毕,可以把结果输出到一个临时表,那么再统计所有记录数就轻而易举了.
下面就是我写的一个语句:
declare @sql varchar(8000),@count int,@step int
set nocount on
--@step越大运行速度越快,但如果太大会造成生成的sql字符串超出限制导致语句不完整出错
--建议为50
set @step = 50
if object_id(N'tempdb.db.#temp') is not null
drop table #temp
create table #temp (name sysname,count numeric(18))
if object_id(N'tempdb.db.#temp1') is not null
drop table #temp1
create table #temp1 (id int identity(1,1),name sysname)
insert into #temp1(name)
select name from sysobjects where xtype = 'u';
set @count = @@rowcount while @count>0
begin
set @sql = ''
select @sql = @sql + ' select ''' + name + ''',count(1) from ' + name + ' union'
from #temp1 where id > @count - @step and id <= @count
set @sql = left(@sql,len(@sql) - len('union'))
insert into #temp exec (@sql)
set @count = @count - @step
end
select count(count) 总表数,sum(count) 总记录数 from #temp
select * from #temp order by count,name
set nocount off
经过测试,该方法可以通过,不过有时候@step的值需要手动设置一下,@step=50应该就可以满足大部分数据库的需要了.如果表名都比较短的话,可以设置@step=80或者100.