首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

T-SQL 游標動態 SQL 批量檢測空表腳本

     編輯:關於SqlServer

需求

快速找出資料庫中所有使用者表的列數,識別空表(列數 = 0)。

動態 SQL + 游標實作

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,**無需掃描表資料**,秒級完成,強烈推薦生產環境使用。

適用版本

  • 游標動態 SQL:SQL Server 2000+
  • sys.partitions 方案:SQL Server 2005+
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved