我希望能够输出 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
以避免在对同一对象进行分区时多次调用这些函数(并在结果中返回与表分区数一样多的行)
–
|
–
–
|