Я предпочитаю решение для основы события по следующим причинам
Если вы используете SQL Server 2005 и выше, вы также можете использовать это:
SELECT
t.NAME AS TableName,
i.name as indexName,
p.[Rows],
sum(a.total_pages) as TotalPages,
sum(a.used_pages) as UsedPages,
sum(a.data_pages) as DataPages,
(sum(a.total_pages) * 8) / 1024 as TotalSpaceMB,
(sum(a.used_pages) * 8) / 1024 as UsedSpaceMB,
(sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
WHERE
t.NAME NOT LIKE 'dt%' AND
i.OBJECT_ID > 255 AND
i.index_id <= 1
GROUP BY
t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY
object_name(i.object_id)
На мой взгляд, с ним проще работать, чем с выводом sp_msforeachtable
.
Если вы используете MySQL> 4.x, вы можете использовать следующее:
select TABLE_NAME, TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA="test";
Имейте в виду, что для некоторых механизмов хранения TABLE_ROWS является приблизительным значением.
Первое, что пришло в голову, это использовать sp_msForEachTable
exec sp_msforeachtable 'select count(*) from ?'
, который не перечисляет имена таблиц, поэтому его можно расширить до
exec sp_msforeachtable 'select parsename(''?'', 1), count(*) from ?'
. Проблема в том, что если база данных имеет более 100 таблиц, вы получите следующее сообщение об ошибке:
Запрос превысил максимум количество наборов результатов, которые могут быть отображается в таблице результатов. Только первые 100 наборов результатов отображается в сетке.
В итоге я использовал табличную переменную для хранения результатов
declare @stats table (n sysname, c int)
insert into @stats
exec sp_msforeachtable 'select parsename(''?'', 1), count(*) from ?'
select
*
from @stats
order by c desc
Как видно здесь, это вернет правильные подсчеты, тогда как методы, использующие таблицы метаданных, будут возвращать только оценки.
CREATE PROCEDURE ListTableRowCounts
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #TableCounts
(
TableName VARCHAR(500),
CountOf INT
)
INSERT #TableCounts
EXEC sp_msForEachTable
'SELECT PARSENAME(''?'', 1),
COUNT(*) FROM ? WITH (NOLOCK)'
SELECT TableName , CountOf
FROM #TableCounts
ORDER BY TableName
DROP TABLE #TableCounts
END
GO