not a complete answer, but how about something like this
build dynamic sql from the INFORMATION_SCHEMA.COLUMNS table -
you could maybe introduce your own flag to flag variable/non-variable length fields.
Building the SQL using a cursor is an option too
--data lengths of each table
DECLARE @SQLa as nvarchar(max) ='';
select @SQLa = @SQLa +
'SELECT COALESCE(DATALENGTH(['+ Column_Name +']), 0) as dlen, '''
+ Column_Name
+ ''' colname, '''
+ Table_name
+ ''' tabname FROM ['
+ Table_name
+ '] UNION ALL ' FROM INFORMATION_SCHEMA.COLUMNS
SELECT @SQLa = LEFT(@SQLa, LEN(@SQLa) -10)
SELECT @SQLa = 'SELECT DQ.tabname, SUM(DQ.dlen) as TotalLen FROM (' + @SQLa + ') DQ GROUP BY tabname'
select @SQLa;
EXEC sp_executesql @sqla;