SQL Server master 數據庫內建兩個強大但未文檔化的存儲過程:sp_MSForEachDB(遍歷所有數據庫)與 sp_MSForEachTable(遍歷當前庫所有表),極大簡化跨庫/跨表的批量管理任務。
參數列表:
@command1/2/3:對每個數據庫依次執行的最多三條命令(每組作為一個批次)。@replacechar:替換默認佔位符 ?(數據庫名),避免命令中包含問號衝突。@precommand/@postcommand:循環前/後執行的全局命令(如創建/清理臨時表收集結果)。實戰:獲取每個庫用戶表空間使用情況
EXEC sp_MSForEachDB @command1 = 'USE ? EXEC sp_spaceused';
輸出示例(文本模式 Ctrl+T):
Database_name Database_size Unallocated_space ------------- ------------- ----------------- master 5.25 MB 1.26 MB reserved data index_size unused ------------- ------------- --------------- ----- 2808 KB 1144 KB 1080 KB 584 KB ...
額外參數:@whereand 支持 WHERE/Order By 子句篩選/排序目標表。
實戰:統計 AdventureWorks 庫每表行數並按表名排序
EXEC sp_MSForEachTable
@command1 = 'PRINT ''?''',
@command2 = 'SELECT COUNT(*) FROM ?',
@whereand = 'ORDER BY 1';
輸出片段:
[HumanResources].[Department] 16 [HumanResources].[Employee] 290 [HumanResources].[EmployeeAddress] 290 ...
@precommand 創建全局臨時表 ##Results,@command1 插入各庫/表統計,@postcommand 查詢匯總。? 時,設置 @replacechar = '|',命令改用 | 代替數據庫/表名。@whereand = 'AND schema_id = SCHEMA_ID(''Sales'')' 僅處理特定 Schema 表。