【发布时间】:2013-07-18 21:02:15
【问题描述】:
SQL Server Management Studio Express 有没有办法列出所有非空表?我有 100 多个表要检查数据。
【问题讨论】:
-
在单个数据库或多个数据库中?
标签: sql-server tsql ssms
SQL Server Management Studio Express 有没有办法列出所有非空表?我有 100 多个表要检查数据。
【问题讨论】:
标签: sql-server tsql ssms
您可以尝试使用sysindexes 和INFORMATION_SCHEMA.TABLES:)
SELECT 'Table Name'=convert(char(25),t.TABLE_NAME),
'Total Record Count'=max(i.rows)
FROM sysindexes i, INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_NAME = object_name(i.id)
and t.TABLE_TYPE = 'BASE TABLE'
GROUP BY t.TABLE_SCHEMA, t.TABLE_NAME
HAVING max(i.rows)>0
ORDER BY 'Total Record Count' DESC
【讨论】:
Morris Miao's solution 使用已弃用的sys.sysindexes 视图;并根据表名对INFORMATION_SCHEMA.TABLES进行join,不保证唯一;甚至在数据库中。
Simon's solution 不在当前数据库范围内;但可以通过使用sys.tables进行细化:
SELECT r.table_name, r.row_count, r.[object_id]
FROM sys.tables t
INNER JOIN (
SELECT OBJECT_NAME(s.[object_id]) table_name, SUM(s.row_count) row_count, s.[object_id]
FROM sys.dm_db_partition_stats s
WHERE s.index_id in (0,1)
GROUP BY s.[object_id]
) r on t.[object_id] = r.[object_id]
WHERE r.row_count > 0
ORDER BY r.table_name;
【讨论】:
试试看:
WITH TableRows AS
(
SELECT
SUM(row_count) AS [RowCount],
OBJECT_NAME(OBJECT_ID) AS TableName
FROM
sys.dm_db_partition_stats
WHERE
index_id = 0 OR index_id = 1
GROUP BY
OBJECT_ID
)
SELECT *
FROM TableRows
WHERE [RowCount] > 0
【讨论】:
假设表格可以有两种类型。
SQL Server 中的所有表都划分为分区。这样所有表都至少有一个分区。
在sys.partitions 中,所有表的每个分区都存在一行。
sys.partitions 中的这些行包含有关相应表的该分区中行数的信息。
由于 SQL Server 中的所有表都至少包含一个分区,因此我们可以从sys.partitions 获取有关表中行数的信息。
SELECT
OBJECT_NAME(T.OBJECT_ID) AS TABLE_NAME,
SUM(P.ROWS) AS TOTAL_ROWS
FROM
SYS.TABLES T
INNER JOIN
SYS.PARTITIONS P
ON T.OBJECT_ID = P.OBJECT_ID
WHERE
P.INDEX_ID IN (0,1)
GROUP BY
T.OBJECT_ID
HAVING
SUM(P.ROWS) > 0
在对不同分区中的行求和时,我们正在考虑index_id (0,1)
index_id = 0 for Heapindex_id = 1 for Clustered indexindex_id > 1 are for nonclustered index.一张表可以有一个聚集索引,也可以没有。
但非聚集索引并非如此。一个表可以有多个非聚集索引。
所以我们不能在对行求和时使用那些index_id。
index_id = 0
index_id = 1
【讨论】:
也可以使用“对象资源管理器详细信息 (F7)”,导航到感兴趣的数据库的“表”文件夹并设置对象资源管理器详细信息以显示行数(右键单击标题)
【讨论】:
这是对@jophab's answer 的轻微改进。它将显示表的架构以及使用sys.partitions 比较rows = 0。
SELECT
sch.name as SchemaName,
t.NAME AS TableName,
p.rows AS RowCounts
FROM
sys.tables t
INNER JOIN
sys.partitions p ON t.object_id = p.OBJECT_ID
INNER JOIN sys.schemas sch
on t.schema_id = sch.schema_id
WHERE
t.NAME NOT LIKE 'dt%'
AND t.is_ms_shipped = 0
AND p.rows = 0
GROUP BY
sch.name,t.Name, p.Rows
ORDER BY
sch.name,t.Name
【讨论】: