SQLSERVER中统计所有表的记录数

原创 2007年09月19日 17:55:00
   今天群里的一个朋友问了个问题:如何把数据库里所有表的记录数都统计出来?
   由于以前我曾经试着写过一个存储过程,作用就是删除所有表的内容,思路是这样的:
   首先通过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.

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

 

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_MSforeachtablesp_MSforeachdb,用于遍历某个数据库的每个表和遍历DBMS管理下的每个数据库。

【SQL Server】统计表记录数

本文罗列了通过系统视图统计表记录数的方法以替代传统的count(*)方法。
  • wltom1985
  • wltom1985
  • 2016年02月25日 16:01
  • 1469

统计ORACLE当前用户下所有表中的记录数

SQL> show userUSER is "AAA"SQL> set serverout on写一个脚本,查询当前用户下所有的表并统计记录数。declarev_table varchar2(60);...
  • ilovemilk
  • ilovemilk
  • 2008年12月09日 14:52
  • 6961

统计一个数据库中每一个表的记录数

use information_schema; select table_name,table_rows from tables where TABLE_SCHEMA = '数据库名' order b...
  • zyf_balance
  • zyf_balance
  • 2017年06月02日 13:58
  • 449

利用MySQL查询所有数据库表以及表中的记录数

1、问题背景     在一个数据库中,查看所有数据库表;为了测试需要清空数据库所有表,但是不能清空用户表、角色表、权限表和角色权限表。2、命令实现USE information_schema; SE...
  • you23hai45
  • you23hai45
  • 2017年03月02日 22:36
  • 1831

统计mysql表数量及表记录数

统计MySQL中某个数据库中有多少张表 SELECT count(*) TABLES, table_schema FROM information_schema.TABLES    where t...
  • age_of_big_data
  • age_of_big_data
  • 2017年04月28日 15:19
  • 1237

查询SQL SERVER所有表记录数和体积大小

declare aaa  cursor forselect  table_name from information_schema.tables WHERE  TABLE_type=BASE TABL...
  • szliszt
  • szliszt
  • 2008年05月21日 21:13
  • 2926

SQLServer中统计所有表记录数

1、sysobjects记录数据库中所有表以及视图等信息。 2、sysindexes记录所有表中的索引、行数等数值。   统计表以及行数: SELECT a.name, b.rows  FROM sy...
  • mayougen
  • mayougen
  • 2015年11月13日 11:10
  • 37

使用mysql存储过程-统计某个数据库下的所有表的记录数

其中用到了游标(cursor),循环(loop),动态SQL预处理(prepare)等技术,特此记录一下。 CREATE PROCEDURE statis_rows() BEGIN DECLA...
  • cheng564943797
  • cheng564943797
  • 2017年03月03日 14:22
  • 1150

查询数据库中所有表的行数(sqlserver 2000)

 终于解决了这个比较郁闷的问题,分享一下方法一:create proc ssasset nocount oncreate table TableSpace( TableName  varchar(50...
  • wenboliang
  • wenboliang
  • 2009年08月18日 12:40
  • 5640

db2统计每个表的行数

1.根据数据库统计信息查询参考信息: 2.自定义脚本遍历表名再select count(*)
  • paololiu
  • paololiu
  • 2016年12月22日 14:06
  • 1981
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQLSERVER中统计所有表的记录数
举报原因:
原因补充:

(最多只允许输入30个字)