Выберите все пустые таблицы в 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