如何获取我的sql-server
数据库中没有任何记录的表列表?
答案 0 :(得分:38)
在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只捕获那些行(表)总行数等于零。
答案 1 :(得分:25)
要获取空表的列表,我们可以使用下面的tsql -
EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
并且,为了获得至少有一行数据的表列表,我们可以使用下面的tsql -
EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
注意:表格列表仅包含“用户表”,即不包括“系统表”。
答案 2 :(得分:6)
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
答案 3 :(得分: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
答案 4 :(得分: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 Heap
index_id = 1 for Clustered index
index_id > 1 are for nonclustered index.
表可以有一个聚簇索引,也可以没有。
但是表可以有多个非聚簇索引。
因此,在对行进行求和时,我们不能使用index_id
个非聚簇索引。
index_id = 0
index_id = 1
答案 5 :(得分:0)
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]