2010-10-20 3 views
6

Esiste un modo SQL per scoprire quali colonne del mio schema sono completamente piene di valori nulli? Ci sono alcuni campi in un paio di tabelle che so che non sono utilizzati dall'applicazione e verranno eliminati, ma volevo vedere se esisteva un modo/script automatico per trovare questo attraverso l'intero database per trovare i candidati per la revisione del codice/possibile rimozione.Come posso trovare tutte le colonne riempite con valori null al 100% nello schema del database di SQL Server?

Esecuzione di SQL Server 2005 su x86 se è importante.

Grazie in anticipo!

+0

Hai visto questa discussione: http://stackoverflow.com/questions/63291/sql-select-columns-with-null-values-only? Ok, avrai bisogno di un altro cursore per ogni tabella. –

risposta

7
create table #SuspectColumns (
    TABLE_SCHEMA sysname, 
    TABLE_NAME sysname, 
    COLUMN_NAME sysname 
) 

declare csrColumns cursor fast_forward for 
    select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
     from INFORMATION_SCHEMA.COLUMNS 
     where IS_NULLABLE = 'YES' 

declare @TABLE_SCHEMA sysname, 
     @TABLE_NAME sysname, 
     @COLUMN_NAME sysname, 
     @sql nvarchar(max) 

open csrColumns 

while (1=1) begin 
    fetch next 
     from csrColumns 
     into @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME 

    if @@FETCH_STATUS<>0 break 

    set @sql = N'if not exists(select 1 from ' + QUOTENAME(@TABLE_SCHEMA) + N'.' + QUOTENAME(@TABLE_NAME) + N' where ' + QUOTENAME(@COLUMN_NAME) + N'is not null) 
        insert into #SuspectColumns values (''' + @TABLE_SCHEMA + N''',''' + @TABLE_NAME + N''',''' + @COLUMN_NAME + N''')' 

    exec sp_executesql @sql 
end /* while */ 

close csrColumns 
deallocate csrColumns 

select * from #SuspectColumns 

drop table #SuspectColumns 
+0

Wow! Questo ha funzionato perfettamente come scritto ed è stato molto più utile di quanto mi aspettassi come strumento di analisi di come stiamo usando il nostro schema (o non lo usiamo, come potrebbe essere questo caso). Funzionava super veloce in 1.145 secondi alla prima corsa, 0.08 secondi alla seconda corsa su 55 tavoli con un totale di 616.000 file. –

0

è possibile restituire il max (colonna) e verificare la presenza di valori null

0

Fuori della parte superiore della mia testa, credo che la seguente SQL dovrebbe funzionare. Eseguirà una query per ogni combinazione di tabella/colonna e la query restituirà il nome della tabella e il nome della colonna se tale combinazione di tabella/colonna non ha righe o tutte le righe nulle.

DECLARE @table_columns TABLE 
(
    table_name nvarchar(128), 
    column_name nvarchar(128) 
); 
DECLARE @table_name nvarchar(128); 
DECLARE @column_name nvarchar(128); 

INSERT INTO @table_columns(table_name, column_name) 
select TABLE_NAME, COLUMN_NAME from INFORMATION_SCHEMA.columns; 

while (select count(*) from @table_columns) > 0 
begin 
    select top 1 @table_name = table_name, @column_name = column_name from @table_columns 
    exec('SELECT ''' + @table_name + ''' as table_name, ''' + @column_name + ''' as column_name WHERE NOT EXISTS (SELECT TOP 1 * FROM ' + @table_name + ' WHERE ' + @column_name + ' IS NOT NULL)') 
    delete from @table_columns where table_name = @table_name and column_name = @column_name 
end 
+0

Se hai tabelle/colonne con nomi non standard (ad esempio 'fo] 'o') o in schemi diversi questo script non funzionerà. –