單一資料表查詢
-- 快速統計 (大量異動後可能不準)
EXEC sp_spaceused '資料表名';
-- 精確統計 (掃描資料頁,較慢)
EXEC sp_spaceused '資料表名', true;
整體資料庫大小
EXEC sp_spaceused; -- 不帶參數顯示資料庫級別大小
所有使用者表批次統計
方法一:快速版 (僅統計資料)
EXEC sp_MSforeachtable "EXEC sp_spaceused '?'";
方法二:精確版 (大資料庫慎用)
EXEC sp_MSforeachtable "EXEC sp_spaceused '?', true";
方法三:自訂暫存表收集並排序 (推薦)
CREATE TABLE #t (
name VARCHAR(200), rows INT, reserved VARCHAR(25),
data VARCHAR(25), index_size VARCHAR(25), unused VARCHAR(25)
);
EXEC sp_MSforeachtable "INSERT INTO #t EXEC sp_spaceused '?'";
SELECT TOP 100 * FROM #t ORDER BY rows DESC;
DROP TABLE #t;
sp_MSforeachtable 參數詳解
| 參數 | 說明 |
| @command1 | 第一條執行 SQL (預設佔位符 ? 代表表名) |
| @replacechar | 自訂佔位符,預設 N'?' |
| @command2/@command3 | 第二、三條執行 SQL |
| @whereand | 額外 WHERE 條件篩選表 (如 AND o.name IN ('T1','T2')) |
| @precommand | 迴圈前執行 (如列印標題) |
| @postcommand | 迴圈後執行 (如列印完成訊息) |
實用範例
-- 列出每表記錄數與大小
EXEC sp_MSforeachtable @command1="PRINT '?'", @command2="EXEC sp_spaceused '?'";
-- 所有資料庫大小
EXEC sp_MSforeachdb @command1="PRINT '?'", @command2="EXEC sp_spaceused";
-- 檢查所有資料庫完整性
EXEC sp_MSforeachdb @command1="PRINT '?'", @command2="DBCC CHECKDB (?)";
-- 更新特定前綴表統計
EXEC sp_MSforeachtable @whereand="AND o.name LIKE 't%'", @replacechar='*',
@precommand="PRINT 'Updating Statistics...'",
@command1="PRINT '*'; UPDATE STATISTICS *",
@postcommand="PRINT 'Complete Update Statistics!'";
-- 清空所有表資料 (保留結構)
EXEC sp_MSforeachtable @command1='DELETE FROM ?';
-- 或更快
EXEC sp_MSforeachtable @command1='TRUNCATE TABLE ?';