Вот решение этого вопроса. Я использовал этот запрос, прежде чем тоже искать пустые столбцы во всех таблицах. Немного изменен теперь для поиска непустых, он может иметь несколько дополнительных деталей, не нужных в вашем примере.
Вы создаете временную таблицу для хранения имен столбцов, которые не являются пустыми, и используете курсор для создания динамических c sql для их поиска.
В конце просто сгенерируйте другую динамику c sql, чтобы выбрать столбцы на основе результатов временной таблицы.
IF (OBJECT_ID('tempdb..#tmpRez') IS NOT NULL) DROP TABLE #tmpRez;
CREATE TABLE #tmpRez (TableName sysname, ColName sysname);
DECLARE crs CURSOR LOCAL FAST_FORWARD FOR
SELECT t.name, c.name FROM sys.tables t
INNER JOIN sys.columns c ON c.object_id=t.object_id
WHERE 1=1
AND t.name = 'Table1' -- OR your own condition
OPEN crs;
DECLARE @tbl sysname;
DECLARE @col sysname;
DECLARE @sql NVARCHAR(MAX);
FETCH NEXT FROM crs INTO @tbl,@col;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = 'IF EXISTS (SELECT * FROM ['+ @tbl+'] WHERE [' + @col + '] <> '''') INSERT INTO #tmpRez SELECT ''' + @tbl +''','''+ @col + '''';
EXEC(@sql);
FETCH NEXT FROM crs INTO @tbl,@col;
END;
CLOSE crs;
DEALLOCATE crs;
SELECT @sql = 'SELECT ' + STUFF((SELECT ',' + ColName FROM #tmpRez x
where x.TableName = y.TableName
FOR XML PATH ('')), 1, 1, '') + ' FROM ' + TableName
FROM #tmpRez y GROUP BY TableName
EXEC (@sql)