Before SQL Server 2005 Enterprise Manager made it easy, I used this script to figure out how much disk space a table took up, and the "real" (average, at least) width of a row.
-- Lists the tables in the selected database and the disk space they use.
-- Also displays the average 'width' of each row in each table.
SET NOCOUNT ON
DECLARE @sSourceDB AS sysname
SET @sSourceDB = 'Northwind' -- <====== Set this value.
-- Holds the space used for each table. Column names reflect sp_spaceused().
CREATE TABLE #SpaceUsed
(
name VARCHAR(128),
rows VARCHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
)
-- Create and open a cursor on the tables.
DECLARE curTables CURSOR
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = @sSourceDB
AND TABLE_TYPE = 'BASE TABLE'
OPEN curTables
-- Iterate the cursor, populating #SpaceUsed for each table from sp_spaceused().
DECLARE @sTableName sysname
FETCH NEXT
FROM curTables
INTO @sTableName
WHILE 0 = @@FETCH_STATUS
BEGIN
DECLARE @sSql SYSNAME
SET @sSql = 'EXEC ' + @sSourceDB +
'..sp_executesql N''INSERT #SpaceUsed EXEC sp_spaceused ' +
@sTableName + ''''
PRINT @sSql
EXEC(@sSql)
FETCH NEXT
FROM curTables
INTO @sTableName
END
CLOSE curTables
DEALLOCATE curTables
-- Display results.
SELECT
name AS 'Table Name',
rows AS 'Row Count',
CASE CAST(REPLACE(rows, ' KB', '') AS INT)
WHEN 0 THEN 'N/A'
ELSE 1024 * CAST(REPLACE(data, ' KB', '') AS INT) /
CAST(REPLACE(rows, ' KB', '') AS INT)
END AS 'Avg Bytes/Row',
data AS 'Data Space +',
index_size AS 'Index(es) Space +',
unused AS 'Unused Space =',
reserved AS 'Total Space'
FROM #SpaceUsed
ORDER BY CAST(REPLACE(reserved, ' KB', '') AS INT) DESC
-- Done.
DROP TABLE #SpaceUsed