我希望能够输出 SQL 数据库中行数大于 0 的任何表。换句话说,如果数据库有 100 个表,我希望能够知道哪些表有行

我尝试了以下方法:

 SELECT table_name
 FROM information_schema.tables
 WHERE table_schema = 'your_database_name' 
 AND table_rows > 0;

但是它说table_rows这是一个无效的列我该怎么办?

2

  • 请参阅:


    – 

  • 当您说“任何表”时,您是否实际上希望将“系统表”包含在输出中,还是仅包含所有“用户表”???


    – 


最佳答案
2

您可以从表中获取表的行数partitions

因此,您将加入该表并检查哪些表的行数 > 0。

如果您想查看这些表的行数,请执行以下操作:

SELECT 
  t.name AS table_name,
  SUM(p.rows) AS row_count
FROM 
  sys.schemas s
  JOIN sys.tables t 
    ON t.schema_id = s.schema_id
  JOIN sys.partitions p 
    ON p.object_id = t.object_id
WHERE
  s.name = 'your_schema_name' 
  AND p.index_id <= 1
GROUP BY t.name
HAVING SUM(p.rows) > 0;

如果您不需要这些信息,而只是想获取表名,则可以跳过一个JOIN,而使用子查询来提高性能:

SELECT 
  t.name AS table_name
FROM 
  sys.schemas s
  JOIN sys.tables t 
    ON t.schema_id = s.schema_id
WHERE 
  s.name = 'your_schema_name' 
  AND t.object_id IN 
    (SELECT p.object_id 
     FROM sys.partitions p 
     WHERE 
       p.index_id <= 1 AND 
       p.rows > 0);

参见此

3

  • 2
    可能为了谨慎起见想添加 p.index_id <=1


    – 

  • 2
    无需检索所有分区的信息并将它们相加,因为任何非空分区的存在就足够了。因此可能的替代方案是


    – 

  • @MartinSmith 没错,如果他们不关心确切的行数,这会很聪明,添加这个选项。


    – 

SQL Server 的内在功能中隐藏着许多强大功能。当 dmv 中存在“object_id()”列而不存在“database_id”时(例如在 sys.partitions 中),如果对象位于SSMS 或任何其他应用程序中的“当前”数据库中,则无需加入 sys.tables 中。

Microsoft 函数的名称和用途是不言而喻的。

--===== Find all tables in the current database that have rows.
 SELECT TableName = CONCAT(OBJECT_SCHEMA_NAME(object_id),'.',OBJECT_NAME(object_id))
   FROM sys.partitions
  WHERE index_id <= 1 --0 = "Heap", 1 = Clustered Index - Can't exist at same time.
    AND rows     >  0
;

以下是对 Microsoft 文档的引用:

如果您想排除系统表名称,可以执行以下操作……

--===== Find all "user generated" tables in the current database that have rows.
 SELECT TableName = CONCAT(OBJECT_SCHEMA_NAME(object_id),'.',OBJECT_NAME(object_id))
   FROM sys.partitions
  WHERE index_id <= 1 --0 = "Heap", 1 = Clustered Index - Can't exist at same time.
    AND rows     >  0
    AND OBJECTPROPERTY(object_id,'IsMSShipped') = 0 -- Not created during installation
;

这是 OBJECTPROPERTY() 函数的链接。

1

  • 可能应该添加一个GROUP BY object_id以避免在对同一对象进行分区时多次调用这些函数(并在结果中返回与表分区数一样多的行)


    –