Как получить список таблиц в моей базе данных sql-server
, в которой нет записей?
Выберите все пустые таблицы в SQL Server
Ответ 1
В 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 (Common Table Expression) вычисляет количество строк для каждой таблицы и группирует их по таблице (OBJECT_ID
), а внешний SELECT из CTE затем захватывает только те строки (таблицы), которые имеют общее число строк равно нулю.
Ответ 2
Чтобы получить список пустых таблиц, мы можем использовать ниже tsql -
EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
И, чтобы получить список таблиц, имеющих хотя бы одну строку данных, мы можем использовать ниже tsql -
EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
Примечание. Список таблицы включает только "Таблицу пользователей", т.е. не включен "Системная таблица".
Ответ 3
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
Ответ 4
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
Ответ 5
Мы можем просто классифицировать таблицы на два типа.
- Кластерная таблица (таблицы с кластерным индексом)
- Таблицы кучи ( Таблицы, не имеющие кластерного индекса)
В SQL Server все таблицы делятся на partitions
. Для каждой таблицы будет по крайней мере один раздел.
В sys.partitions
для каждой таблицы partition
существует одна строка для всех таблиц.
Записи в sys.partitions
содержат столбец для количества строк в этом разделе соответствующей таблицы.
Так как все таблицы в SQL Server содержат aleast один раздел, мы можем получить информацию о количестве строк в таблице из 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