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

SQL Server 查詢所有資料庫所有表大小資訊:四種實作方案比較

     編輯:關於SqlServer

四種方案架構比較

方案核心技術優點缺點
1游標 + sp_MSforeachdb邏輯直觀,易除錯巢狀動態 SQL 雜亂,錯誤處理弱
2sp_MSforeachtable + sys.databases避免雙層游標需動態建立暫存表跨 DB
3sp_MSforeachdb + sp_MSforeachtable最精簡,單一陳述式結果合併困難,難以排序/彙總
4擴展 sp_MSforeachdb 內建參數支援 @precommand/@postcommand 彙總較進階,需熟悉非文件化參數

方案 3:最精簡單行指令

EXEC sp_MSforeachdb '
USE [?];
EXEC sp_MSforeachtable "EXEC sp_spaceused ''?''"';

輸出為多個結果集,SSMS 顯示分頁,難以整體排序。

方案 4:彙總至暫存表 (推薦生產使用)

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 皆為非文件化預存程序,但廣泛使用於維護腳本。
  • 動態 SQL 中雙引號轉義:'''' 代表單引號。
  • 結果轉型為數值型別便於排序彙總。

單一資料庫結果

所有資料庫結果

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