//查询所有表明 select name from sysobjects where xtype='u' select * from sys.tables //查询数据库中所有的表名及行数 SELECT a.name AS [TABLE NAME] , b.rows AS [RECORD COUNT] FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE ( a.type = 'u' ) AND ( b.indid IN ( 0, 1 ) ) ORDER BY a.name , b.rows DESC //查询所有的标明及空间占用量\行数 select object_name(id) tablename, 8*reserved/1024 reserved, rtrim(8*dpages)+'kb' used, 8*(reserved-dpages)/1024 unused, 8*dpages/1024-rows/1024*minlen/1024 free, rows --,* from sysindexes where indid=1 order by tablename,reserved desc
SELECT T.TABLE_NAME AS [TABLE NAME] , MAX(I.ROWS) AS [RECORD COUNT] FROM SYSINDEXES I , INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME = OBJECT_NAME(I.ID) AND T.TABLE_TYPE = 'BASE TABLE' GROUP BY T.TABLE_SCHEMA , T.TABLE_NAME; --------------------------------------------------------------- SELECT OBJECT_NAME(id) AS [TABLE NAME] , rowcnt AS [RECORD COUNT] FROM sysindexes WHERE indid < 2 AND OBJECTPROPERTY(id, 'ismsshipped') = 0 ORDER BY OBJECT_NAME(id)
--创建临时表 CREATE TABLE ##RowCount ( [TABLE NAME] VARCHAR(500) , [RECORD COUNT] INT ) --执行存储过程 EXEC sp_msforeachtable 'insert into ##RowCount ([TABLE NAME],[RECORD COUNT]) select ''?'' tableName, count(*) dataCount from ?' --查询结果 SELECT * FROM ##RowCount ORDER BY [TABLE NAME] DROP TABLE ##RowCount
--统计一个数据库中所有表记录的数量 -- 最近公司的数据库发现有表的数据被弄掉了,有些数据表记录为0,于是想找出此数据库中到底有哪些数据表的记录都为0以缩小分析范围,可使用如下的SQL Statement: CREATE TABLE #tmptb ( tbname sysname , tbrows INT , tbREserved VARCHAR(10) , tbData VARCHAR(10) , tbIndexSize VARCHAR(10) , tbUnUsed VARCHAR(10) ) INSERT INTO #tmptb EXEC sp_MSForEachTable 'EXEC sp_spaceused ''?''' SELECT * FROM #tmptb --列出所有表的情况 SELECT tbrows , tbname FROM #tmptb WHERE tbrows = 0 --列出记录数据为0的表 ORDER BY tbname DROP TABLE #tmptb --其中 --tbname 表名 --tbrows 记录数 --tbREserved 保留空间 --tbData 使用空间 --tbIndexSize 索引使用空间 --tbUnUsed 未用空间
--SQLServer遍历数据库所有表及统计表数据总数: DECLARE @TableName VARCHAR(255); CREATE TABLE #GetRecordingTempTable ( [id] [INT] IDENTITY(1, 1) NOT NULL , [TableName] VARCHAR(255) NOT NULL , [RecordingCount] INT ); DECLARE Table_Cursor CURSOR FOR SELECT [name] FROM sysobjects WHERE xtype = 'U'; OPEN Table_Cursor; FETCH NEXT FROM Table_Cursor INTO @TableName; WHILE ( @@FETCH_STATUS = 0 ) BEGIN EXEC('INSERT INTO #GetRecordingTempTable ([TableName],[RecordingCount]) SELECT '''+@TableName+''', COUNT(0) FROM ['+@TableName+'];'); FETCH NEXT FROM Table_Cursor INTO @TableName; END CLOSE Table_Cursor; DEALLOCATE Table_Cursor; SELECT [TableName] AS [表名称] , [RecordingCount] AS [总记录数] FROM #GetRecordingTempTable ORDER BY [TableName]; DROP TABLE #GetRecordingTempTable; GO我们都知道用聚合函数count()可以统计表的行数。如果需要统计数据库每个表各自的行数(DBA可能有这种需求),用count()函数就必须为每个表生成一个动态SQL语句并执行,才能得到结果。以前在互联网上看到有一种很好的解决方法,忘记出处了,写下来分享一下。
该方法利用了sysindexes 系统表提供的rows字段。rows字段记录了索引的数据级的行数。解决方法的代码如下:
select schema_name(t.schema_id) as [Schema], t.name as TableName,i.rows as [RowCount] from sys.tables as t, sysindexes as i where t.object_id = i.id and i.indid <=1
该方法连接了sys.tables视图,从中找出表名和schema_id,再通过schema_name函数获取表的架构名。筛选条件i.indid <=1 只选聚集索引或者堆,每个表至少有一个堆或者聚集索引,从而保证为每个表返回一行。
该方法的优点有:
运行速度非常快。
由于不访问用户表,不会在用户表上放置锁,不会影响用户表的性能。
可以将该查询写成子查询、CTE或者视图,与其它查询结合使用。