Может быть, слишком упрощенно, но основная идея может быть расширена различными способами (у меня обычно есть переменные для @CRLF
и @TAB
для генерации кода):
DECLARE @sql AS varchar(MAX)
SELECT @sql = COALESCE(@sql + CHAR(13) + CHAR(10) + 'UNION' + CHAR(13) + CHAR(10), '')
+ 'SELECT ''' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + '.' + QUOTENAME(COLUMN_NAME) + ''' AS COLUMN_NAME' + CHAR(13) + CHAR(10)
+ CHAR(9) + ',COUNT(*) AS TotalRows' + CHAR(13) + CHAR(10)
+ CHAR(9) + ',COUNT(' + COLUMN_NAME + ') AS NonNullCount' + CHAR(13) + CHAR(10)
+ 'FROM ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS WHERE IS_NULLABLE = 'YES'
PRINT @sql
EXEC (@sql)
Что касается ваших процентов, я не был уверен, что это по всей таблице или только по конкретному столбцу, поэтому я оставлю это в качестве упражнения для читателя.