我需要知道特定数据库中每个表中有多少条记录。我不在乎记录中的内容,他们都需要被计算在内。
我已经知道如何为单个表格SELECT Count(1) FROM [my_table_name]
执行此操作,但这对200多个表格来说有点多余。
答案 0 :(得分: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
这是许多人的一种方法。其他几个选项See here。
答案 1 :(得分:3)
来自How do I get a list of SQL Server tables and their row counts?
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
答案 2 :(得分:1)
正如已经发布的那样,如果它是一次性的话,我可能会使用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)
答案 3 :(得分:1)
我相信你可以得到比这更好的东西,但这应该在紧要关头。为了记录,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