テーブルごとの領域一覧を取得するSQLは以下の通り
--テーブル変数の定義 DECLARE @TEMP_TABLE table( row_id int IDENTITY(1,1) NOT NULL ,T_NAME varchar(128) NULL ,T_CNT bigint ,T_DATA bigint -- KBytes ,T_INDEX bigint -- KBytes PRIMARY KEY (row_id) ) --変数の定義 DECLARE @NAME nvarchar(128), @SQL nvarchar(256) DECLARE @CNT bigint, @DATA bigint, @INDEX bigint declare @row_id int --カーソルの宣言 DECLARE csr_table CURSOR FOR SELECT NAME FROM sysobjects where type='U' ORDER BY NAME --カーソルのオープン OPEN csr_table FETCH NEXT FROM csr_table INTO @NAME WHILE @@FETCH_STATUS = 0 BEGIN --容量を取得し、テーブル変数へ SET @SQL = N'EXEC sp_MStablespace [' + @NAME + ']' INSERT INTO @TEMP_TABLE (T_CNT, T_DATA, T_INDEX) EXECUTE sp_executesql @SQL --テーブル名をセット SET @row_id = @@IDENTITY update @TEMP_TABLE SET T_NAME = @NAME WHERE row_id = @row_id FETCH NEXT FROM csr_table INTO @NAME END --カーソルクローズ CLOSE csr_table DEALLOCATE csr_table --結果を返す SELECT T_NAME as テーブル名, T_CNT as 件数, T_DATA as データ領域_KB, T_INDEX as インデックス領域_KB, (T_DATA+T_INDEX) / 1024 AS 合計_MB, ( select sum(sys.columns.max_length) as Row_Size_byte From sys.tables left join sys.columns on sys.tables.object_id = sys.columns.object_id where sys.tables.name = T_NAME ) as レコードサイズ_Byte FROM @TEMP_TABLE ORDER BY T_NAME
動作確認環境:SQL Server 2008