| 方案 | 核心技術 | 優點 | 缺點 |
|---|---|---|---|
| 1 | 游標 + sp_MSforeachdb | 邏輯直觀,易除錯 | 巢狀動態 SQL 雜亂,錯誤處理弱 |
| 2 | sp_MSforeachtable + sys.databases | 避免雙層游標 | 需動態建立暫存表跨 DB |
| 3 | sp_MSforeachdb + sp_MSforeachtable | 最精簡,單一陳述式 | 結果合併困難,難以排序/彙總 |
| 4 | 擴展 sp_MSforeachdb 內建參數 | 支援 @precommand/@postcommand 彙總 | 較進階,需熟悉非文件化參數 |
EXEC sp_MSforeachdb '
USE [?];
EXEC sp_MSforeachtable "EXEC sp_spaceused ''?''"';
輸出為多個結果集,SSMS 顯示分頁,難以整體排序。
CREATE TABLE #AllTables (db SYSNAME, tbl SYSNAME, rows BIGINT, reservedKB BIGINT, dataKB BIGINT, indexKB BIGINT, unusedKB BIGINT);
EXEC sp_MSforeachdb '
USE [?];
DECLARE @db SYSNAME = DB_NAME();
INSERT INTO #AllTables
EXEC sp_MSforeachtable "
DECLARE @t SYSNAME = ''?'';
DECLARE @out TABLE (name SYSNAME, rows BIGINT, reserved VARCHAR(20), data VARCHAR(20), index_size VARCHAR(20), unused VARCHAR(20));
INSERT @out EXEC sp_spaceused @t;
SELECT ''?'' AS db, name, rows,
CAST(REPLACE(reserved, ''KB'', '''') AS BIGINT),
CAST(REPLACE(data, ''KB'', '''') AS BIGINT),
CAST(REPLACE(index_size, ''KB'', '''') AS BIGINT),
CAST(REPLACE(unused, ''KB'', '''') AS BIGINT)
FROM @out;
"';
SELECT * FROM #AllTables ORDER BY reservedKB DESC;
DROP TABLE #AllTables;
sp_MSforeachdb 與 sp_MSforeachtable 皆為非文件化預存程序,但廣泛使用於維護腳本。'''' 代表單引號。
