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

Master 數據庫雙雄:sp_MSForEachDB 與 sp_MSForEachTable 批量操作實戰

     編輯:關於SqlServer

隱藏的批量利器

Master 數據庫中兩個未文檔化的系統存儲過程 —— sp_MSForEachDB 與 sp_MSForEachTable,能以極簡代碼實現跨數據庫、跨表的批量操作,是 DBA 日常巡檢、統計、維護的得力助手。

sp_MSForEachDB:跨數據庫批量執行

參數詳解

  • @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
... (每個數據庫重複上述結構)

sp_MSForEachTable:單庫內跨表批量執行

擴展參數

  • @whereand:追加 WHERE 或 ORDER BY 子句 (如 "WHERE name LIKE 'tbl_%'" 或 "ORDER BY 1")

命名參數傳遞可跳過空值;@replacechar 解決命令中包含問號的衝突。

實戰:統計 AdventureWorks 所有表行數並按表名排序

EXEC sp_MSForEachTable
  @command1 = "PRINT '?'",
  @command2 = "SELECT COUNT(*) FROM ?",
  @whereand = "ORDER BY 1"

輸出片段:

[HumanResources].[Department]  -----------  16
[HumanResources].[Employee]     -----------  290
[HumanResources].[EmployeeAddress] ----------- 290
...

最佳實踐建議

  1. 生產環境謹慎使用,先在測試庫驗證邏輯
  2. 大量操作時關注事務日誌增長,分批執行
  3. 結合 @precommand 創建臨時表收集結果,便於後續分析
  4. 避免在高峰期運行資源密集型批量任務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved