SQL Server如何查看所有数据库所有表大小信息2014-08-08一、背景之前写了篇关于:SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)的文章,它罗列出某个数据所有表的信息,这些信息包括:表的记录数、数据记录占用空间、索引占用空间、没使用的空间等(如Figure1所示),现在我来讲述如何获取整个数据库实例中所有数据库所有表的信息(如Figure2所示)。

(Figure1:某数据库所有表信息)

(Figure2:所有数据库所有表信息)二、实现方法下面内容讲述了在实现Figure2过程中遇到的一些问题,如果你对这些问题不感兴趣可以直接看最后实现的SQL脚本。下面讲述了4种实现方法:1. 游标 + 系统存储过程sp_MSForEachDB,实现脚本为Script3;2. 封装sp_MSforeachtable + sys.databases,实现脚本为Script4和Script5;3. 系统存储过程sp_MSForEachDB + sp_MSforeachtable,实现脚本为Script6;4. 扩展sp_MSforeachdb + sp_MSforeachtable,实现脚本为Script7;(一) 我们在SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)的SQL脚本中进行改进,结合sp_MSForEachDB系统存储过程进行实现:1) 既然有了获取某个数据库所有表信息的脚本,那就可以在外层再套使用sp_MSForEachDB系统存储过程,下面的Script1脚本可以获取到所有数据库的所有表的信息,效果如Figure3所示:
--Script1:--查看所有数据库所有表信息EXEC sp_MSForEachDB "USE [?];DECLARE @tablespaceinfo TABLE (nameinfo VARCHAR(50),rowsinfo INT,reserved VARCHAR(20),datainfo VARCHAR(20),index_size VARCHAR(20),unused VARCHAR(20))DECLARE @tablename VARCHAR(255);DECLARE Info_cursor CURSOR FORSELECT ""[""+[name]+""]"" FROM sys.tables WHERE TYPE=""U"";OPEN Info_cursorFETCH NEXT FROM Info_cursor INTO @tablenameWHILE @@FETCH_STATUS = 0BEGININSERT INTO @tablespaceinfo EXEC sp_spaceused @tablenameFETCH NEXT FROM Info_cursorINTO @tablenameENDCLOSE Info_cursorDEALLOCATE Info_cursorSELECT * FROM @tablespaceinfoORDER BY Cast(Replace(reserved,""KB"","""") AS INT) DESC"