Выбрать все пустые таблицы в SQL Server - PullRequest
26 голосов
/ 12 апреля 2011

Как получить список таблиц в моей базе данных sql-server, в которых нет записей?

Ответы [ 5 ]

38 голосов
/ 12 апреля 2011

В 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 затем захватывает только те строки (таблицы), у которых общее количество строк равно нулю.

25 голосов
/ 20 декабря 2012

Чтобы получить список пустых таблиц, мы можем использовать следующий tsql -

EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' '

И, чтобы получить список таблиц, содержащих хотя бы одну строку данных, мы можем использовать приведенный ниже tsql -

EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' '

Примечание: в список таблиц включены только «Пользовательские таблицы», т.е. не включены «Системные таблицы».

6 голосов
/ 29 августа 2012
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
0 голосов
/ 30 мая 2018

Мы можем просто классифицировать таблицы на два типа.

  1. Кластерная таблица (таблицы с кластерным индексом)
  2. Таблицы кучи ( Таблицы, не имеющие кластерного индекса)

В 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
0 голосов
/ 03 апреля 2018
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...