sql-server - это - sql server скачать




Запросить список записей в каждой таблице в базе данных (10)

Как перечислить количество строк каждой таблицы в базе данных. Некоторый эквивалент

select count(*) from table1
select count(*) from table2
...
select count(*) from tableN

Я отправлю решение, но приветствуются другие подходы


В этом подходе используется конкатенация строк для создания оператора со всеми таблицами и их подсчетами динамически, например, пример (ы), заданный в исходном вопросе:

          SELECT COUNT(*) AS Count,'[dbo].[tbl1]' AS TableName FROM [dbo].[tbl1]
UNION ALL SELECT COUNT(*) AS Count,'[dbo].[tbl2]' AS TableName FROM [dbo].[tbl2]
UNION ALL SELECT...

Наконец, это выполняется с помощью EXEC :

DECLARE @cmd VARCHAR(MAX)=STUFF(
                    (
                        SELECT 'UNION ALL SELECT COUNT(*) AS Count,''' 
                              + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME) 
                              + ''' AS TableName FROM ' + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME)
                        FROM INFORMATION_SCHEMA.TABLES AS t
                        WHERE TABLE_TYPE='BASE TABLE'
                        FOR XML PATH('')
                    ),1,10,'');
EXEC(@cmd);

Вы можете попробовать следующее:

SELECT  OBJECT_SCHEMA_NAME(ps.object_Id) AS [schemaname],
        OBJECT_NAME(ps.object_id) AS [tablename],
        row_count AS [rows]
FROM sys.dm_db_partition_stats ps
WHERE OBJECT_SCHEMA_NAME(ps.object_Id) <> 'sys' AND ps.index_id < 2
ORDER BY 
        OBJECT_SCHEMA_NAME(ps.object_Id),
        OBJECT_NAME(ps.object_id)

Если вы используете 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 .


Первое, что пришло в голову, - использовать 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


Фрагмент, который я нашел в http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=21021 который помог мне:

select t.name TableName, i.rows Records
from sysobjects t, sysindexes i
where t.xtype = 'U' and i.id = t.id and i.indid in (0,1)
order by TableName;

Чтобы получить эту информацию в SQL Management Studio, щелкните правой кнопкой мыши по базе данных, затем выберите Отчеты -> Стандартные отчеты -> Использование диска по таблице.


Я думаю, что самый короткий, самый быстрый и простой способ:

SELECT
    object_name(object_id) AS [Table],
    SUM(row_count) AS [Count]
FROM
    sys.dm_db_partition_stats
WHERE
    --object_schema_name(object_id) = 'dbo' AND 
    index_id < 2
GROUP BY
    object_id

sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); 
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) 
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'

Вывод:


SELECT 
    T.NAME AS 'TABLE NAME',
    P.[ROWS] AS 'NO OF ROWS'
FROM SYS.TABLES T 
INNER JOIN  SYS.PARTITIONS P ON T.OBJECT_ID=P.OBJECT_ID;




database