Я должен знать, сколько записей находится в каждой таблице в конкретной базе данных. Я не забочусь о том, что находится в записи, они должны будут все считаться.
Я уже знаю, как сделать это для единственной таблицы как SELECT Count(1) FROM [my_table_name]
, но это становится немного избыточным для 200 + таблицы.
Попробуйте следующее: (Очень быстрый метод, хотя потенциально менее точный.)
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
Это один из многих методов. См. Здесь несколько других вариантов.
Как уже было сказано, если бы это была разовая вещь, я бы, вероятно, использовал 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)
Из Как получить список таблиц 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
Я уверен, что вы можете получить что-нибудь получше, но это должно сработать в крайнем случае. Для записи, 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