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

SQL Server 迭代操作利器:sp_MSForEachDB / sp_MSForEachTable 批次處理全資料庫/全資料表

     編輯:關於SqlServer

隱藏系統預存程序:未文件化但極實用

master 資料庫內建 sp_MSForEachDB、sp_MSForEachTable,**對每個資料庫/資料表迴圈執行命令**,適合批次管理、巡檢、統計。

sp_MSForEachDB:遍歷所有資料庫

參數

  • @command1、@command2、@command3:依序執行的 3 條命令。
  • @replacechar:替換預設佔位符 ? (資料庫名)。
  • @precommand:迴圈前執行。@postcommand:迴圈後執行。

每命令集作為一個批次在目標資料庫內執行。**輸出導向文字模式 (Ctrl+T) 適合導出報表。**

範例:列出每個資料庫的使用者表空間統計

EXEC sp_MSForEachDB @command1 = 'USE ? EXEC sp_spaceused';

輸出:每個資料庫名、大小、未配置空間、資料/索引/未使用空間明細。

sp_MSForEachTable:遍歷當前資料庫所有使用者表

參數 (多 1 個 @whereand)

  • @whereand:WHERE 條件或 ORDER BY 子句,篩選/排序目標表。

範例 1:列出 AdventureWorks 每個表的列數,按表名排序

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

輸出:
[HumanResources].[Department] 16
[HumanResources].[Employee] 290
... (含 Schema 名稱,完整識別)。

範例 2:僅處理特定 Schema 下的表

EXEC sp_MSForEachTable
    @command1 = 'PRINT ''?''',
    @command2 = 'SELECT COUNT(*) FROM ?',
    @whereand = "AND schema_name(schema_id) = 'Sales'";

關鍵提醒

  • **未文件化、無官方支援**,版本升級可能變更/移除,**生產核心流程勿硬依賴**。
  • 動態 SQL 隱性注入風險:? 直接置換,**確保資料庫/表名無惡意字元**。
  • 大量表迴圈可能長時間佔用資源,**建議離峰執行、加批次大小控制**。
  • 現代替代:sys.databases / sys.tables + 游標/動態 SQL 組裝,**完全可控、有文件支援**。

sp_MSForEach* 是 DBA **臨時巡檢、一次性腳本** 的神兵利器,**認知其存在、掌握用法、敬畏其風險**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved