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

sp_MSforeachtable 與 sp_MSforeachdb:未公開系統預存程序實戰

     編輯:關於SqlServer

SQL Server 內建兩個未文件化的系統預存程序 sp_MSforeachtable (遍歷單一資料庫所有資料表) 與 sp_MSforeachdb (遍歷執行個體所有資料庫),極適合批次維護作業。

參數說明 (sp_MSforeachtable)

參數型別預設用途
@command1nvarchar(2000)必填對每個資料表執行的第 1 條 T-SQL,? 代表資料表名稱
@replacecharnchar(1)N'?'替換字元,可自訂
@command2nvarchar(2000)NULL第 2 條 T-SQL
@command3nvarchar(2000)NULL第 3 條 T-SQL
@whereandnvarchar(2000)NULL篩選資料表的額外 WHERE 條件
@precommandnvarchar(2000)NULL迴圈前執行一次
@postcommandnvarchar(2000)NULL迴圈後執行一次

sp_MSforeachdb 參數相同,僅無 @whereand,? 代表資料庫名稱。

經典用法範例

1. 統計每個資料表空間使用量

EXEC sp_MSforeachtable @command1 = "EXEC sp_spaceused '?'";

2. 查詢所有使用者資料表列數

CREATE TABLE #t (tbl sysname, cnt int);
EXEC sp_MSforeachtable 'INSERT #t SELECT ''?'', COUNT(*) FROM ?';
SELECT * FROM #t ORDER BY tbl;
DROP TABLE #t;

3. 單一資料庫模式下檢查所有資料表完整性

-- 需先設定單一使用者模式
EXEC sp_dboption 'db_name', 'single user', 'true';
EXEC sp_MSforeachtable "DBCC CHECKTABLE('?', REPAIR_REBUILD)";
EXEC sp_dboption 'db_name', 'single user', 'false';

4. 批次備份所有使用者資料庫

EXEC sp_MSforeachdb
  @precommand = "DECLARE @path nvarchar(200) = 'D:\\Backup\\'",
  @command1 = "IF '?' NOT IN ('master','model','msdb','tempdb')
    BACKUP DATABASE [?] TO DISK = @path + '?' + '.bak'";

注意事項

  • 屬於未文件化功能,微軟不保證相容性,生產環境重要作業建議改用 sys.tables + 動態 SQL 或 PowerShell/SMO。
  • ? 會自動加上方括號 [?],若資料表名含特殊字元仍可能失敗。
  • 交易範圍:每個 command 獨立自動認可,若需跨表交易需自行包裝。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved