找出SQL Server数据库中总共存储了多少行的简单方法?

找出SQL Server数据库中总共存储了多少行的简单方法?,sql,sql-server,sql-server-2005,sql-server-2008,Sql,Sql Server,Sql Server 2005,Sql Server 2008,我正在寻找一种简单的方法来计算一个SQLServer2005/2008数据库中的所有行,当然跳过系统表?我知道我可以用 SELECT COUNT (COLUMN) FROM TABLE 然后对每个表进行计算,然后将其相加,但是否希望采用某种自动方式 有吗?您可以查询sysindex,查看每个表上聚集索引的rowcnt值。但我不确定这到底有多先进 或者,在一个小型测试数据库上进行类似的简单测试: CREATE TABLE #TableRowCount (TableName NVARCHAR(12

我正在寻找一种简单的方法来计算一个SQLServer2005/2008数据库中的所有行,当然跳过系统表?我知道我可以用

SELECT COUNT (COLUMN) FROM TABLE
然后对每个表进行计算,然后将其相加,但是否希望采用某种自动方式


有吗?

您可以查询sysindex,查看每个表上聚集索引的rowcnt值。但我不确定这到底有多先进

或者,在一个小型测试数据库上进行类似的简单测试:

CREATE TABLE #TableRowCount (TableName NVARCHAR(128), RowCnt BIGINT)
INSERT #TableRowCount (TableName, RowCnt) 
EXECUTE sp_msforeachtable 'SELECT "?", COUNT(*) FROM ?'
SELECT SUM(RowCnt) AS TotalRowCount FROM #TableRowCount
DROP TABLE #TableRowCount

我不确定MS SQL的较旧版本是否有数据字典的SQL标准信息

您可以执行以下操作:

SELECT SUM(table_rows)
FROM  information_schema.tables
WHERE table_schema = 'DATABASENAME'
尝试:

这是索引行。这可能只是一个近似值,因为数据库变化很大,有些内容可能无法编制索引,但这会很快

编辑:请注意,so.xtype是用户类型,假设您不需要系统内容,只需要真实的数据内容

EDIT2:无火焰注意:在sysobjects表上查询可能不是个好主意:

EDIT3:为了专门解决需求,并且没有关联联接:

SELECT sum(mycount) from
(SELECT 
    MAX(si.rows) AS mycount
FROM 
    sysobjects AS so 
    join sysindexes AS si  on si.id = OBJECT_ID(so.name) 

WHERE 
    so.xtype = 'U' 
GROUP BY 
  so.name 
) as mylist
我们知道,sp_spaceused在传递一个表名时,将返回一个行计数,因此我们可以检查它的功能—它查询sys.dm_db_partition_stats—并复制它以获得以下结果:

SELECT
    SUM(ddps.row_count) TotalRows
FROM
    sys.indexes i
    INNER JOIN sys.objects o ON i.OBJECT_ID = o.OBJECT_ID
    INNER JOIN sys.dm_db_partition_stats ddps ON 
        o.OBJECT_ID = ddps.OBJECT_ID
        AND i.index_id = ddps.index_id
WHERE
    i.index_id < 2
    AND o.is_ms_shipped = 0 -- to exclude system tables

然而,奇怪的是,我不得不说…

这是我今天对一个类似问题的回答:

SQL Server 2005或更高版本提供了一个非常有用的报告,其中显示了表的大小(包括行数等)。它在标准报告中,并且是按表列出的磁盘使用情况


在编程方面,有一个很好的解决方案:

检查未记录的存储过程。使用它,您可以对数据库中的每个表运行Count*。针对您的具体问题:

EXEC sp_MSforeachtable 'SELECT ''?'', Count(*) as NumberOfRows FROM ?'
这将是准确的,但运行查询时在事务中添加或删除的任何行可能除外。而且,它也不会有点击单个表格的费用


但正如我在另一篇评论中提到的,我不确定这如何帮助您确定数据库中保存了多少数据。当然,有几排,但如果我有10个杯子,每半杯水,而你有5个杯子,每一个都满,那么我们中谁的水更多?

不幸的是,MS SQL中没有这一点:MS SQL 2008中提供了这一点。管理委员会问了我这个问题,因为当局想知道我们在数据库中保存了多少数据。您存储的行数对您保存了多少数据几乎没有帮助。如果一个表有240000行,但只有一列宽,而另一个表有1000行,但有240列,有多少数据?我知道。但政府机构专门询问了我们数据库的行数。我想他们的统计数据应该与其他金融机构进行比较。如果这是正确的问题,那不是我的问题:-它可以工作,尽管它看起来像是运行了多个查询,给了我很多输出,之后我将不得不手动相加。其他呈现的选项似乎更合理。除了提供一个集合而不是一个数字之外,这确实不是解决问题的有效方法,IMHO。另请参阅我对@AdaTheDev的评论。DMV中提供了此信息-对每个表运行游标执行COUNT*可能非常昂贵。还请注意,sp_msforeachtable未记录且不受支持,因此其行为可能随时更改或完全删除。True。我得到的印象是/假设这是一项一次性任务,这反映在建议的方法中。同意DMV是一种更好的方式!谢谢,这似乎是一个最简单的查询,命中率最低。我还向其他提供同样好信息的人授予了一些分数,但获胜者可能只有一个。最好的方法是在server 2012中使用内置的“顶级表的磁盘使用情况”报告,右键单击该表,查看属性,选择“存储”选项卡,然后获得行数。
EXEC sp_MSforeachtable 'SELECT ''?'', Count(*) as NumberOfRows FROM ?'
SELECT SUM(row_count)
    FROM sys.dm_db_partition_stats
    WHERE index_id IN (0,1)
    AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;