Master 數據庫中兩個未文檔化的系統存儲過程 —— sp_MSForEachDB 與 sp_MSForEachTable,能以極簡代碼實現跨數據庫、跨表的批量操作,是 DBA 日常巡檢、統計、維護的得力助手。
@command1/2/3:三條順序執行的命令@replacechar:替換佔位符 ? (默認數據庫名)@precommand:循環前執行@postcommand:循環後執行每個命令集作為獨立批次在各數據庫上下文中執行,適合結果輸出至文本而非結果集場景(查詢分析器 Ctrl+T 切換文本模式)。
EXEC sp_MSForEachDB @command1 = "USE ? EXEC sp_spaceused"
輸出示例:
數據庫名 數據庫大小 未分配空間
master 5.25 MB 1.26 MB
reserved data index_size unused
2808 KB 1144 KB 1080 KB 584 KB
... (每個數據庫重複上述結構)
@whereand:追加 WHERE 或 ORDER BY 子句 (如 "WHERE name LIKE 'tbl_%'" 或 "ORDER BY 1")命名參數傳遞可跳過空值;@replacechar 解決命令中包含問號的衝突。
EXEC sp_MSForEachTable
@command1 = "PRINT '?'",
@command2 = "SELECT COUNT(*) FROM ?",
@whereand = "ORDER BY 1"
輸出片段:
[HumanResources].[Department] ----------- 16
[HumanResources].[Employee] ----------- 290
[HumanResources].[EmployeeAddress] ----------- 290
...
@precommand 創建臨時表收集結果,便於後續分析