SELECT * FROM INFORMATION_SCHEMA.Columns WHERE is_nullable = 'YES'
TableName RowCount ColumnName Nulls Non-Nulls---------- --------- ------------ ---- --------- tableA 10 id 0 10tableA 10 Col1 0 10tableA 10 Col2 3 7
DECLARE @table TABLE(table_name VARCHAR(255), column_name VARCHAR(255), null_count INT, non_null_count INT, total_count INT)DECLARE @sql VARCHAR(MAX), @final_sql VARCHAR(MAX)DECLARE c_cols CURSOR FOR SELECT 'Select ''' + table_name + ''' as table_name, ''' + column_name + ''' as column_name, (Select Count([' + column_name + ']) as rows From ' + table_schema + '.' + table_name + ' Where [' + column_name + '] Is Null) as nulls, (Select Count([' + column_name + ']) as rows From ' + table_schema + '.' + table_name + ' Where [' + column_name + '] Is Not Null) as non_nulls, (Select Count([' + column_name + ']) as rows From ' + table_schema + '.' + table_name + ') as total' AS sql FROM INFORMATION_SCHEMA.Columns WHERE Table_Name LIKE 'a%'OPEN c_colsFETCH Next FROM c_cols INTO @sqlWHILE @@FETCH_STATUS = 0 BEGIN SET @final_sql = ISNULL(@final_sql, '') + @sql + ' Union All ' FETCH Next FROM c_cols INTO @sql ENDCLOSE c_colsDEALLOCATE c_colsPRINT @final_sql
IF OBJECT_ID('dbo.column_sql') IS NULL BEGIN CREATE TABLE dbo.column_sql ( id INT IDENTITY(1,1) PRIMARY KEY, sql_statement VARCHAR(8000) ) ENDELSE BEGIN TRUNCATE TABLE dbo.column_sql ENDDECLARE @sql VARCHAR(8000), @final_sql VARCHAR(8000), @id INTINSERT INTO dbo.column_sql ( sql_statement ) SELECT 'Select ''' + table_name + ''' as table_name, ''' + column_name + ''' as column_name, (Select Count([' + column_name + ']) as rows From ' + table_schema + '.' + table_name + ' Where [' + column_name + '] Is Null) as nulls, (Select Count([' + column_name + ']) as rows From ' + table_schema + '.' + table_name + ' Where [' + column_name + '] Is Not Null) as non_nulls, (Select Count([' + column_name + ']) as rows From ' + table_schema + '.' + table_name + ') as total' AS sql FROM INFORMATION_SCHEMA.Columns WHILE EXISTS (SELECT * FROM dbo.column_sql) BEGIN DECLARE c_sql CURSOR FOR SELECT TOP 100 id, sql_statement FROM dbo.column_sql ORDER BY id OPEN c_sql FETCH Next FROM c_sql INTO @id, @sql WHILE @@FETCH_STATUS = 0 BEGIN PRINT ' IN Fetch Loop' SET @final_sql = ISNULL(@final_sql, '') + @sql + ' Union All ' DELETE FROM dbo.column_sql WHERE id = @id PRINT 'Row deleted' FETCH Next FROM c_sql INTO @id, @sql END SELECT @final_sql CLOSE c_sql DEALLOCATE c_sql END
Set @final_sql = ''