MS SQL 2008 - 获取数据库中的所有表名及其行数

Posted

技术标签:

【中文标题】MS SQL 2008 - 获取数据库中的所有表名及其行数【英文标题】:MS SQL 2008 - get all table names and their row counts in a DB 【发布时间】:2012-10-08 16:02:32 【问题描述】:

我正在尝试通过应用程序(由其他人开发)确定哪些表受到数据更新的影响。数据库中有 200 多个表,我想避免检查每个表的更改。

还有其他方法可以列出所有表名及其行数吗?

select table_name from information_schema.tables

列出我的数据库购买中的所有表我如何也包括行数?

【问题讨论】:

如果也有删除,你会怎么做?如果它发生在同一张表上(插入和删除)怎么办?也许在你的表上创建一个表触发器和一个额外的 audit 表来为你存储信息。 可能重复:***.com/questions/2221555/… 【参考方案1】:

试试这个,既简单又快速

SELECT T.name AS [TABLE NAME], I.rows AS [ROWCOUNT] 
FROM   sys.tables AS T 
   INNER JOIN sys.sysindexes AS I ON T.object_id = I.id 
   AND I.indid < 2 ORDER  BY I.rows DESC

【讨论】:

【参考方案2】:

为了完整性而发布。

如果您正在 all 数据库 中寻找 all 表的行数(这正是我要寻找的),那么我找到了这个this 和 this 的组合工作。不知道它是否是最优的:

SET NOCOUNT ON
DECLARE @AllTables table (DbName sysname,SchemaName sysname, TableName sysname, RowsCount int )
DECLARE
     @SQL nvarchar(4000)
SET @SQL='SELECT ''?'' AS DbName, s.name AS SchemaName, t.name AS TableName, p.rows AS RowsCount FROM [?].sys.tables t INNER JOIN sys.schemas s ON t.schema_id=s.schema_id INNER JOIN [?].sys.partitions p ON p.OBJECT_ID = t.OBJECT_ID'

INSERT INTO @AllTables (DbName, SchemaName, TableName, RowsCount)
    EXEC sp_msforeachdb @SQL
SET NOCOUNT OFF
SELECT DbName, SchemaName, TableName, SUM(RowsCount), MIN(RowsCount), SUM(1)
FROM @AllTables
WHERE RowsCount > 0
GROUP BY DbName, SchemaName, TableName
ORDER BY DbName, SchemaName, TableName

【讨论】:

我运行了你的代码,它似乎运行良好,所以我过早地赞成它。在查看最终结果时,RowsCount 值似乎不正确。我在最终的 SELECT 命令中添加了 SUM(1), MIN(RowsCount),发现当 SUM(1) > 1 时,SUM(RowsCount) 实际上是 MIN(RowsCount)*SUM(1)。 (即:如果表的 MIN(RowsCount) = 15 & SUM(1) = 5,则您的查询显示 SUM(RowsCount) = 75 ...这是不正确的)。想法? @programmer43229:您在表 sys.partitions 中看到的行数记录为“近似值”。【参考方案3】:

获取数据库中的所有表:

select * from INFORMATION_SCHEMA.TABLES

获取数据库中的所有列:

select * from INFORMATION_SCHEMA.columns

获取数据库中的所有视图:

select * from INFORMATION_SCHEMA.TABLES where table_type = 'view'

【讨论】:

你好,斯拉沃。我的查询中有什么错误。你还添加了我最初添加的相同查询【参考方案4】:
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

看这个:

SQL SERVER – Find Row Count in Table – Find Largest Table in Database.

【讨论】:

它没有显示正确的计数。如果您运行此语句“sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) + CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'" 你会得到不同的结果

以上是关于MS SQL 2008 - 获取数据库中的所有表名及其行数的主要内容,如果未能解决你的问题,请参考以下文章

获取 MS SQL Server 2008 的连接字符串

sql server2008怎么实现查询某个数据库中所有的表名

如何使用 MS SQL 获取所有字段记录中使用的不同单词列表?

使用c#获取数据库中的所有表名

MS SQL Server 2008 R2 常规操作

怎么用SQL语句获取指定数据库中的所有表名