Как найти все столбцы, заполненные на 100% пустыми значениями в моей схеме базы данных SQL Server? - PullRequest
6 голосов
/ 20 октября 2010

Есть ли способ SQL, чтобы узнать, какие столбцы в моей схеме полностью заполнены нулевыми значениями?В некоторых таблицах есть несколько полей, которые, как мне известно, не используются приложением и будут отброшены, но я хотел посмотреть, существует ли автоматический способ / сценарий, чтобы найти это по всей базе данных и найти кандидатов для проверки кода./ возможно удаление.

Запуск SQL Server 2005 на x86, если это имеет значение.

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 20 октября 2010
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 голосов
/ 20 октября 2010

Я считаю, что следующий SQL должен работать.Он выполнит запрос для каждой комбинации таблицы / столбца, и запрос вернет имя таблицы и имя столбца, если в этой комбинации таблицы / столбца либо нет строк, либо все пустые строки.

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 голосов
/ 20 октября 2010

вы можете вернуть максимум (столбец) и проверить на ноль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...