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;