我想不出一個容易辦法做到這一點從我的頭頂。
一種方式是做動態生成TSQL列出每個表中的每一列可能使用像這樣做的總大小:
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + CHAR(10) + 'UNION ALL' + CHAR(10), '') +
'SELECT ''' + QUOTENAME(t.name) + ''' AS TableName, ''' + QUOTENAME(c.name) + ''' AS ColumnName, SUM(DATALENGTH(' + QUOTENAME(c.name) + ')) AS TotalSizeBytes
FROM ' + QUOTENAME(t.name)
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = 'VoterAccount'
SET @SQL = 'SELECT TableName, ColumnName, TotalSizeBytes FROM (' + @SQL + ') x ORDER BY TotalSizeBytes DESC'
PRINT @SQL -- Just PRINT the SQL out. You can then copy it, and execute manually
這將返回例如
TableName ColumnName TotalSizeBytes
Table1 Column1 123456789
Table1 Column3 34356464
Table2 ColumnA 33987987
然而,我關心的是這很可能是一個相當沉重查詢運行,因此首先我會仔細考慮一下。如果沒有更好的建議,並且您嘗試這樣做,則可能需要限制它僅查看列的子集 - 即忽略從一開始就知道的任何列的大小,將焦點放在您知道可能存在的列上是更大的。
理想的解決方案是,如果這些信息已經保存在系統表中/可以通過DMV訪問 - 不幸的是,我不知道它是否是,如果可用,我從來沒有遇到過。
這與exec(@SQL)語句的組合完全符合我的需要,謝謝。因此,您用EXEC(@SQL)取代PRINT @SQL的解決方案非常完美。 – LaBracca 2010-09-23 11:33:16