在當前資料庫中迴圈遍歷所有使用者表 (sys.tables, type='U'),動態執行 SELECT COUNT(1) 並列印表名與列數,適用於快速掌握資料量分佈。
DECLARE CountTableRecords CURSOR READ_ONLY FOR
SELECT sst.name, SCHEMA_NAME(sst.schema_id)
FROM sys.tables sst
WHERE sst.type = 'U';
DECLARE @name VARCHAR(80), @schema VARCHAR(40);
OPEN CountTableRecords;
FETCH NEXT FROM CountTableRecords INTO @name, @schema;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
PRINT @name;
DECLARE @sql NVARCHAR(1024);
SET @sql = 'DECLARE @count INT; ' +
'SELECT @count = COUNT(1) FROM ' + QUOTENAME(@schema) + '.' + QUOTENAME(@name) + '; ' +
'PRINT @count;';
EXEC sp_executesql @sql;
END
FETCH NEXT FROM CountTableRecords INTO @name, @schema;
END
CLOSE CountTableRecords;
DEALLOCATE CountTableRecords;
GO
READ_ONLY 游標:唯讀順向,開銷最小。SCHEMA_NAME(schema_id):取得結構描述名,配合 QUOTENAME 防止特殊字元/注入。sp_executesql 替代 EXEC(@sql):參數化潛力、計畫重用更佳 (此處無參數但屬好習慣)。COUNT(1) vs COUNT(*):現代優化器等價,習慣用 COUNT(1)。-- 利用系統目錄快速估算 (不掃描資料頁)
SELECT
SCHEMA_NAME(t.schema_id) AS SchemaName,
t.name AS TableName,
p.rows AS RowCount
FROM sys.tables t
JOIN sys.partitions p ON p.object_id = t.object_id
WHERE t.type = 'U' AND p.index_id IN (0,1) -- heap 或 clustered index
ORDER BY p.rows DESC;
差異:sys.partitions.rows 為統計資料估算值 (可能過時),COUNT(1) 為即時精確值。大表估算誤差可接受時優先用目錄查詢,毫秒級完成;需精確值時再用游標逐表統計。
游標動態 SQL 版本適合精確統計需求;目錄視圖版本適合快速概覽。兩者互補,視場景選擇。