快速找出資料庫中所有使用者表的列數,識別空表(列數 = 0)。
DECLARE @sql NVARCHAR(MAX) = N'SELECT ''dummy'' AS n, 0 AS c' -- 佔位,便於 UNION
DECLARE @table_name NVARCHAR(255)
DECLARE cur CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
OPEN cur
FETCH NEXT FROM cur INTO @table_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + N' UNION ALL SELECT ' + QUOTENAME(@table_name, '''') + N' AS n, COUNT(*) AS c FROM ' + @table_name
FETCH NEXT FROM cur INTO @table_name
END
CLOSE cur
DEALLOCATE cur
SET @sql = @sql + N' ORDER BY c ASC' -- 空表排在最前
-- 執行並顯示結果
EXEC sp_executesql @sql
QUOTENAME 防止識別碼注入/特殊字元CURSOR LOCAL FAST_FORWARD READ_ONLY:唯讀順向游標,效能最佳UNION ALL 避免去重開銷dummy 確保結果集結構一致n c -------------------------- ----------- Schema.EmptyTable 0 Schema.AnotherEmpty 0 Schema.BigTable 1234567 ...
SELECT
QUOTENAME(s.name) + '.' + QUOTENAME(t.name) AS TableName,
SUM(p.rows) AS RowCount
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
JOIN sys.partitions p ON p.object_id = t.object_id AND p.index_id IN (0,1)
GROUP BY s.name, t.name
HAVING SUM(p.rows) = 0 -- 只看空表
ORDER BY TableName
此法查詢系統目錄視圖 sys.partitions,**無需掃描表資料**,秒級完成,強烈推薦生產環境使用。
sys.partitions 方案:SQL Server 2005+