Как получить количество строк для всех таблиц в базе данных SQL SERVER
Я ищу SQL Script, который может использоваться, чтобы определить, есть ли какие-либо данные (например, количество строк) в любой из таблиц данной базы данных.
Идея состоит в том, чтобы повторно воплотить базу данных в случае наличия любых существующих строк (в любой базе данных).
Говорящей о базе данных является Microsoft SQL SERVER.
Может ли кто-нибудь предложить образец script?
Ответы
Ответ 1
Следующий SQL получит вам количество строк всех таблиц в базе данных:
CREATE TABLE #counts
(
table_name varchar(255),
row_count int
)
EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?'
SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC
DROP TABLE #counts
Результатом будет список таблиц и их количество строк.
Если вам просто нужен общий подсчет строк по всей базе данных, добавьте:
SELECT SUM(row_count) AS total_row_count FROM #counts
предоставит вам одно значение для общего количества строк во всей базе данных.
Ответ 2
Если вы хотите передать время и ресурсы, необходимые для подсчета (*) ваших трехмиллионных таблиц строк. Попробуйте это в SQL SERVER Central от Kendal Van Dyke.
Количество строк с использованием sysindexes
Если вы используете SQL 2000, вам нужно использовать sysindexes следующим образом:
-- Shows all user tables and row counts for the current database
-- Remove OBJECTPROPERTY function call to include system objects
SELECT o.NAME,
i.rowcnt
FROM sysindexes AS i
INNER JOIN sysobjects AS o ON i.id = o.id
WHERE i.indid < 2 AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0
ORDER BY o.NAME
Если вы используете SQL-запросы или запросы на запрос sysindexes, все равно будет работать, но Microsoft сообщит, что sysindexes могут быть удалены в будущей версии SQL Server, поэтому, если вы используете эффективную практику, вам следует использовать DMV, например:
-- Shows all user tables and row counts for the current database
-- Remove is_ms_shipped = 0 check to include system objects
-- i.index_id < 2 indicates clustered index (1) or hash table (0)
SELECT o.name,
ddps.row_count
FROM sys.indexes AS i
INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
AND i.index_id = ddps.index_id
WHERE i.index_id < 2 AND o.is_ms_shipped = 0 ORDER BY o.NAME
Ответ 3
Работает на Azure, не требует хранимых процедур.
SELECT t.name, s.row_count from sys.tables t
JOIN sys.dm_db_partition_stats s
ON t.object_id = s.object_id
AND t.type_desc = 'USER_TABLE'
AND t.name not like '%dss%'
AND s.index_id IN (0,1)
Кредит.
Ответ 4
Этот выглядит лучше, чем другие, которые я думаю.
USE [enter your db name here]
GO
SELECT SCHEMA_NAME(A.schema_id) + '.' +
A.Name, SUM(B.rows) AS 'RowCount'
FROM sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE A.type = 'U'
GROUP BY A.schema_id, A.Name
GO
Ответ 5
SQL Server 2005 или более поздняя версия дает неплохой отчет, показывающий размеры таблиц - включая количество строк и т.д. Это в стандартных отчетах - и это использование диска по таблице.
Программно, есть приятное решение:
http://www.sqlservercentral.com/articles/T-SQL/67624/
Ответ 6
SELECT
sc.name +'.'+ ta.name TableName, SUM(pa.rows) RowCnt
FROM
sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC
Ответ 7
Короткий и сладкий
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX);
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX))
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'
Вывод:
![enter image description here]()
Ответ 8
Не используйте SELECT COUNT(*) FROM TABLENAME
, так как это ресурсоемкая операция. Нужно использовать Динамические представления управления SQL Server или Системные каталоги, чтобы получить информацию о количестве строк для всех таблиц в базе данных.
Ответ 9
Я бы сделал небольшое изменение в решении Фредерика. Я бы использовал хранимую процедуру системы sp_spaceused, которая также будет содержать размеры данных и индексов.
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = 'sp_spaceused ' + @tablename
exec sp_executesql @stmt
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
Ответ 10
выберите все строки из представления information_schema.tables и выдайте оператор count (*) для каждой записи, которая была возвращена из этого представления.
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = 'select @rowcount = count(*) from ' + @tablename
exec sp_executesql @stmt, N'@rowcount int output', @[email protected] OUTPUT
print N'table: ' + @tablename + ' has ' + convert(nvarchar(1000),@rowcount) + ' rows'
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
Ответ 11
Здесь приведен динамический SQL-подход, который также дает вам схему:
DECLARE @sql nvarchar(MAX)
SELECT
@sql = COALESCE(@sql + ' UNION ALL ', '') +
'SELECT
''' + s.name + ''' AS ''Schema'',
''' + t.name + ''' AS ''Table'',
COUNT(*) AS Count
FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
FROM sys.schemas s
INNER JOIN sys.tables t ON t.schema_id = s.schema_id
ORDER BY
s.name,
t.name
EXEC(@sql)
При необходимости было бы тривиально расширять его, чтобы запускать все базы данных в экземпляре (присоединяться к sys.databases
).
Ответ 12
Это мое любимое решение для SQL 2008, которое помещает результаты в таблицу темпа "TEST", которую я могу использовать для сортировки и получения нужных мне результатов:
SET NOCOUNT ON
DBCC UPDATEUSAGE(0)
DROP TABLE #t;
CREATE TABLE #t
(
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
) ;
INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?'''
SELECT * INTO TEST FROM #t;
DROP TABLE #t;
SELECT name, [rows], reserved, data, index_size, unused FROM TEST \
WHERE ([rows] > 0) AND (name LIKE 'XXX%')
Ответ 13
SELECT
SUM(sdmvPTNS.row_count) AS [DBRows]
FROM
sys.objects AS sOBJ
INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
ON sOBJ.object_id = sdmvPTNS.object_id
WHERE
sOBJ.type = 'U'
AND sOBJ.is_ms_shipped = 0
AND sdmvPTNS.index_id < 2
GO