如何获取SQL SERVER数据库中所有表的行计数

我正在search一个SQL脚本,可用于确定给定数据库的任何表中是否有任何数据(即行数)。

这个想法是重新体现数据库,以防存在任何行(在任何数据库中)。

所说的数据库是Microsoft SQL SERVER。

有人可以build议一个示例脚本?

以下SQL将为您提供数据库中所有表的行计数:

CREATE TABLE #counts ( table_name varchar(255), row_count int ) EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?' SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC DROP TABLE #counts 

输出将是一个表和他们的行计数列表。

如果你只是想要整个数据库的总行数,追加:

 SELECT SUM(row_count) AS total_row_count FROM #counts 

将为您获取整个数据库中总行数的单个值。

如果您想要通过计算(*)您的300万行表格所需的时间和资源。 由Kendal Van Dyke试用这个SQL SERVER Central。


使用sysindexes进行行计数如果您使用的是SQL 2000,则需要使用sysindexes,如下所示:

 -- Shows all user tables and row counts for the current database -- Remove OBJECTPROPERTY function call to include system objects SELECT o.NAME, i.rowcnt FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id = o.id WHERE i.indid < 2 AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0 ORDER BY o.NAME 

如果您使用的是SQL 2005或2008,查询sysindexes仍然可以,但是Microsoftbuild议可以在将来的SQL Server版本中删除sysindexes,所以最好使用DMV,如下所示:

 -- Shows all user tables and row counts for the current database -- Remove is_ms_shipped = 0 check to include system objects -- i.index_id < 2 indicates clustered index (1) or hash table (0) SELECT o.name, ddps.row_count FROM sys.indexes AS i INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID AND i.index_id = ddps.index_id WHERE i.index_id < 2 AND o.is_ms_shipped = 0 ORDER BY o.NAME 

在Azure上工作,不需要存储特效。

 SELECT t.name, s.row_count from sys.tables t JOIN sys.dm_db_partition_stats s ON t.object_id = s.object_id AND t.type_desc = 'USER_TABLE' AND t.name not like '%dss%' AND s.index_id IN (0,1) 

信用 。

这个看起来比我想象的要好。

 USE [enter your db name here] GO SELECT SCHEMA_NAME(A.schema_id) + '.' + A.Name, SUM(B.rows) AS 'RowCount' FROM sys.objects A INNER JOIN sys.partitions B ON A.object_id = B.object_id WHERE A.type = 'U' GROUP BY A.schema_id, A.Name GO 

SQL Server 2005或更高版本提供了一个相当不错的报告,显示表格的大小 – 包括行数等。它在标准报告中 – 它是表格的光盘使用情况。

以编程方式,有一个很好的解决scheme: http : //www.sqlservercentral.com/articles/T-SQL/67624/

 SELECT sc.name +'.'+ ta.name TableName, SUM(pa.rows) RowCnt FROM sys.tables ta INNER JOIN sys.partitions pa ON pa.OBJECT_ID = ta.OBJECT_ID INNER JOIN sys.schemas sc ON ta.schema_id = sc.schema_id WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0) GROUP BY sc.name,ta.name ORDER BY SUM(pa.rows) DESC 

简短而甜蜜

 sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) + CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t' 

输出:

在这里输入图像说明

不要使用SELECT COUNT(*) FROM TABLENAME ,因为这是一个资源密集型操作。 应该使用SQL Serverdynamicpipe理视图系统目录来获取数据库中所有表的行计数信息。

我会对弗雷德里克的解决scheme做一点小改动。 我将使用sp_spaceused系统存储过程,这将包括数据和索引大小。

 declare c_tables cursor fast_forward for select table_name from information_schema.tables open c_tables declare @tablename varchar(255) declare @stmt nvarchar(2000) declare @rowcount int fetch next from c_tables into @tablename while @@fetch_status = 0 begin select @stmt = 'sp_spaceused ' + @tablename exec sp_executesql @stmt fetch next from c_tables into @tablename end close c_tables deallocate c_tables
declare c_tables cursor fast_forward for select table_name from information_schema.tables open c_tables declare @tablename varchar(255) declare @stmt nvarchar(2000) declare @rowcount int fetch next from c_tables into @tablename while @@fetch_status = 0 begin select @stmt = 'sp_spaceused ' + @tablename exec sp_executesql @stmt fetch next from c_tables into @tablename end close c_tables deallocate c_tables 

从information_schema.tables视图中select所有行,并为从该视图返回的每个条目发出一个count(*)语句。

 declare c_tables cursor fast_forward for select table_name from information_schema.tables open c_tables declare @tablename varchar(255) declare @stmt nvarchar(2000) declare @rowcount int fetch next from c_tables into @tablename while @@fetch_status = 0 begin select @stmt = 'select @rowcount = count(*) from ' + @tablename exec sp_executesql @stmt, N'@rowcount int output', @rowcount=@rowcount OUTPUT print N'table: ' + @tablename + ' has ' + convert(nvarchar(1000),@rowcount) + ' rows' fetch next from c_tables into @tablename end close c_tables deallocate c_tables 

这里有一个dynamic的SQL方法,也给你这个模式:

 DECLARE @sql nvarchar(MAX) SELECT @sql = COALESCE(@sql + ' UNION ALL ', '') + 'SELECT ''' + s.name + ''' AS ''Schema'', ''' + t.name + ''' AS ''Table'', COUNT(*) AS Count FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) FROM sys.schemas s INNER JOIN sys.tables t ON t.schema_id = s.schema_id ORDER BY s.name, t.name EXEC(@sql) 

如果需要的话,将其扩展为运行实例中的所有数据库(连接到sys.databases )将是微不足道的。

这是我最喜欢的SQL 2008解决scheme,它将结果放到一个“TEST”临时表中,我可以使用它来sorting和获取我需要的结果:

 SET NOCOUNT ON DBCC UPDATEUSAGE(0) DROP TABLE #t; CREATE TABLE #t ( [name] NVARCHAR(128), [rows] CHAR(11), reserved VARCHAR(18), data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18) ) ; INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?''' SELECT * INTO TEST FROM #t; DROP TABLE #t; SELECT name, [rows], reserved, data, index_size, unused FROM TEST \ WHERE ([rows] > 0) AND (name LIKE 'XXX%') 
  SELECT SUM(sdmvPTNS.row_count) AS [DBRows] FROM sys.objects AS sOBJ INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS ON sOBJ.object_id = sdmvPTNS.object_id WHERE sOBJ.type = 'U' AND sOBJ.is_ms_shipped = 0 AND sdmvPTNS.index_id < 2 GO