Как считать каждую запись в каждой таблице в Базе данных SQL Server 2005 года?

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

Я уже знаю, как сделать это для единственной таблицы как SELECT Count(1) FROM [my_table_name], но это становится немного избыточным для 200 + таблицы.

5
задан Heather M 29 March 2010 в 20:29
поделиться

4 ответа

Попробуйте следующее: (Очень быстрый метод, хотя потенциально менее точный.)

SELECT   so.name, MAX(si.rows) 
FROM     sysobjects so
JOIN     sysindexes si ON so.xtype = 'U' 
AND      si.id = OBJECT_ID(so.name) 
GROUP BY so.name 
ORDER BY 2 DESC

Это один из многих методов. См. Здесь несколько других вариантов.

4
ответ дан 14 December 2019 в 01:05
поделиться

Как уже было сказано, если бы это была разовая вещь, я бы, вероятно, использовал sp_msforeachtable. Однако, это недокументированная системная процедура, так что если это проблема, то вы можете легко сделать вот так:

DECLARE @SQL VARCHAR(MAX)
SET @SQL = ''

SELECT @SQL = 
    @SQL + 'SELECT ''' + TABLE_NAME + ''' AS TableName, COUNT(*) AS RecordCount 
            FROM [' + TABLE_NAME + '];' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES

EXECUTE (@SQL)
1
ответ дан 14 December 2019 в 01:05
поделиться

Из Как получить список таблиц SQL Server и количество их строк?

DECLARE @SQL VARCHAR(255) 
SET @SQL = 'DBCC UPDATEUSAGE (' + DB_NAME() + ')' 
EXEC(@SQL) 

CREATE TABLE #foo 
( 
    tablename VARCHAR(255), 
    rc INT 
) 

INSERT #foo 
    EXEC sp_msForEachTable 
        'SELECT PARSENAME(''?'', 1), 
        COUNT(*) FROM ?' 

SELECT tablename, rc 
    FROM #foo 
    ORDER BY rc DESC 

DROP TABLE #foo 
3
ответ дан 14 December 2019 в 01:05
поделиться

Я уверен, что вы можете получить что-нибудь получше, но это должно сработать в крайнем случае. Для записи, sp_spaceused - ваш друг в таких запросах!

DECLARE @tbls table (TableID int identity, TableName varchar(max))

INSERT INTO @tbls
SELECT t1.name
FROM sysobjects t1
INNER JOIN sysindexes t2
ON t1.id = t2.id
WHERE t2.indid <= 1
AND t2.rows > 0
AND OBJECTPROPERTY(t1.id,'IsUserTable') = 1

DECLARE @tblcount int

SELECT @tblcount=COUNT(1)
FROM @tbls

DECLARE @results table (name varchar(max), [rows] bigint, reserved varchar(max), data varchar(max), index_size varchar(max), unused varchar(max))

DECLARE @counter int
SET @counter = 0
DECLARE @tblname varchar(max)

while @counter < @tblcount
begin
    SELECT @tblname=TableName FROM @tbls WHERE TableID=@counter+1

    INSERT INTO @results
    exec sp_spaceused @tblname

    SET @counter = @counter+1
end

SELECT * FROM @results
1
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: