一、背景
在性能調優或者需要了解某數據庫表信息的時候,最直觀的方式就是羅列出這個數據所有表的信息,這些信息包括:表的記錄數、數據記錄占用空間、索引占用空間、未使用的空間等(如Figure1所示),有了這些信息你可以簡單的判斷這個數據庫來自數據上的壓力可能是某個表造成的。因為表數據越大,對數據庫性能的影響越大。
要實現某個數據庫所有表的信息,可以通過游標的形式獲取相應的數據,下圖Figure1返回某數據庫中所有表的信息:

(Figure1:某數據庫所有表信息)
也許你並不滿足於Figure1的信息,你希望獲取整個數據庫實例中所有數據庫所有表的信息(如Figure2所示),如果想了解裡面的實現可以參考:SQL Server 查看所有數據庫所有表大小信息(Sizes of All Tables in All Database)

(Figure2:所有數據庫所有表信息)
二、實現
首先定義一個臨時表變量@tablespaceinfo用於保存表的信息,使用游標讀取sys.tables中的表名稱,再通過sp_spaceused獲取這個表的相關數據插入到臨時表變量@tablespaceinfo。下面是SQL腳本的實現,效果就如Figure1所示:
--Script1:
--查看某數據庫所有表的信息
DECLARE @tablespaceinfo TABLE (
[name] SYSNAME,
[rows] BIGINT,
[reserved] VARCHAR(100),
[data] VARCHAR(100),
[index_size] VARCHAR(100),
[unused] VARCHAR(100)
)
DECLARE @tablename VARCHAR(255);
DECLARE Info_cursor CURSOR FOR
SELECT '['+[name]+']' FROM sys.tables WHERE TYPE='U';
OPEN Info_cursor
FETCH NEXT FROM Info_cursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @tablespaceinfo EXEC sp_spaceused @tablename
FETCH NEXT FROM Info_cursor INTO @tablename
END
CLOSE Info_cursor
DEALLOCATE Info_cursor
SELECT * FROM @tablespaceinfo
ORDER BY Cast(Replace(reserved,'KB','') AS INT) DESC