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

SQL Server 未文檔化系統存儲過程實戰:sp_MSForEachDB 與 sp_MSForEachTable 跨庫/跨表批量操作

     編輯:關於SqlServer

隱藏寶藏:官方文檔未收錄的高效工具

SQL Server master 數據庫內建兩個強大但未文檔化的存儲過程:sp_MSForEachDB(遍歷所有數據庫)與 sp_MSForEachTable(遍歷當前庫所有表),極大簡化跨庫/跨表的批量管理任務。

sp_MSForEachDB 參數詳解與實戰

參數列表:

  • @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
...

sp_MSForEachTable 參數詳解與實戰

額外參數:@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 表。

注意事項與風險提示

  • 未文檔化意味著版本間可能變更/移除,生產關鍵作業建議封裝為自定義存儲過程,內部調用並添加版本兼容判斷。
  • 大量數據庫/表遍歷時長較長,避免業務高峰期執行;命令批次執行特性需注意事務邊界。
  • 輸出結果建議導向文本/文件,避免 SSMS 網格渲染大量結果集導致客戶端卡頓。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved