SQLServer中查询数据库中所有表的数据数量的方法
要查询一个表的数据数量,相信大家很快就想到了select count(1) from table1,但如果我们要查询数据库中所有表的的数据数量要怎么查呢?方法比较多,下面介绍两种本人常用的方法:
一,利用sp_spaceused存储过程,sp_spaceused一次只能查询一个表的数据情况,所以使用sp_spaceused还得结合游标,不是很好的解决方法,大家可以参考第二种方法:
利用sp_spaceused的方法如下:
set nocount on
create table #t1
(
name varchar(200),
rows int,
reserved varchar(50),
data varchar(50),
index_size varchar(50),
unused varchar(50)
)
declare @tablename varchar(200)
declare @sql varchar(2000)
declare m_cursor cursor local for select object_name(object_id) from sys.objects where type='U'
open m_cursor
fetch next from m_cursor into @tablename
while @@fetch_status=0
begin
set @sql='insert into #t1 exec sp_spaceused '+@tablename
exec(@sql)
fetch next from m_cursor into @tablename
end
close m_cursor
deallocate m_cursor
select name,rows from #t1
drop table #t1
简单介绍一下存储过程sp_spaceused作用:显示行数、保留的磁盘空间以及当前数据库中的表、索引视图或 SQL Server 2005 Service Broker 队列所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间。
如果我们这样执行:sp_spaceused 表名
它会返回六列结果,截图如下:
name:表名
rows:该表的数据行数
reserved:由数据库中对象分配的空间总量
data:数据使用的空间总量
index_size:索引使用的空间总量
unused:保留但尚未使用的空间总量
其中rows就是我们要的结果列。
二,利用sys.dm_db_partition_stats,Sql命令如下:
select b.name,a.row_count from sys.dm_db_partition_stats a,
sys.objects b
where a.object_id=b.object_id
and a.index_id<=1
and b.type='U'
sys.dm_db_partition_stats它返回当前数据库中每个分区的页和行计数信息,在上面的sql中,三个关键列的意思如下:
object_id:表或者索引视图的ID,所以可以用它与sys.objects表的object_id相匹配。
row_count:该表或索引视图中数据的数量,就是我们要查询的结果。
index_id:该表或索引视图的索引ID。 如果该表没有索引,那么会在sys.dm_db_partition_stats中存在一行index_id=0的记录,如果有一个聚集索引(而且一个表中也只能有一个聚集索引),那么在sys.dm_db_partition_stats中存在一行index_id=1的记录,而对应的index_id=0的记录没有了。如果这个表在sys.dm_db_partition_stats中存在多行index_id >1的记录,则说明这个表存在多个非聚集索引,我们这里判断index_id<=1,是假定每个表都有主键,且主键为聚集索引。配合sys.objects表的type='U',就可以查出每个用户表的数据数量了。
sys.dm_db_partition_stats其它行的信息,可以查询msdn帮助文档。