【发布时间】:2021-06-18 14:04:56
【问题描述】:
如何获取我的sql-server 数据库中没有任何记录的表的列表?
【问题讨论】:
-
这里,是一个类似的讨论。参考[this](stackoverflow.com/questions/2132701/…) 希望对你有帮助。
标签: sql-server tsql
如何获取我的sql-server 数据库中没有任何记录的表的列表?
【问题讨论】:
标签: sql-server tsql
在 SQL Server 2005 及更高版本上,您可以使用如下内容:
;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
CTE(公用表表达式)中的内部选择计算每个表的行数并按表(OBJECT_ID)对它们进行分组,然后来自 CTE 的外部 SELECT 仅抓取那些具有总行数为零。
更新:如果你想检查非微软/系统表,你需要像这样扩展查询(加入sys.tables目录视图):
;WITH TableRows AS
(
SELECT
SUM(ps.row_count) AS [RowCount],
t.Name AS TableName
FROM
sys.dm_db_partition_stats ps
INNER JOIN
sys.tables t ON t.object_id = ps.object_id
WHERE
(ps.index_id = 0 OR ps.index_id = 1)
AND t.is_ms_shipped = 0
GROUP BY
t.Name
)
SELECT *
FROM TableRows
WHERE [RowCount] = 0
【讨论】:
要获取空表的列表,我们可以使用下面的tsql——
EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
而且,要获得至少有一行数据的表列表,我们可以使用下面的 tsql –
EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
注意:表列表仅包括“用户表”,即不包括“系统表”。
【讨论】:
select a.rows as Rowcnt,
b.name as Tbl_Name
from sys.partitions a
join sys.tables b
on a.object_id=b.object_id
where b.type='u'
and a.rows = 0
【讨论】:
SELECT name AS [TableList] FROM SYS.DM_DB_PARTITION_STATS s
INNER JOIN sys.tables t ON t.[object_id] = s.[object_id]
WHERE row_count = 0
【讨论】:
我们可以简单地将表格分为两种类型。
在 SQL Server 中,所有表都划分为partitions。每个表至少有一个分区。
在sys.partitions 中,所有表中的每个partition 都存在一行。
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_ids。
index_id = 0
index_id = 1
【讨论】:
select schema_name(tab.schema_id) + '.' + tab.name as [TableList]
from sys.tables tab
inner join sys.partitions part
on tab.object_id = part.object_id
where part.index_id IN (1, 0)
group by schema_name(tab.schema_id) + '.' + tab.name
having sum(part.rows) = 0
order by [TableList]
【讨论】: