2014-12-18 6 views
1

Я немного новичок в SQL, поэтому, пожалуйста, несите меня. Я пытаюсь написать какой-то запрос, который позволит мне пройти через всю таблицу и найти количество раз, когда в каждом столбце появляются нулевые значения. Это легко сделать трудный путь, введя следующее:Динамически подсчитывать нулевые значения в SQL Server

Select 
    SUM(CASE COL_1 WHEN IS NULL THEN 1 ELSE 0 END) AS COL_1_NULLS 
    ,SUM(CASE COL_2 WHEN IS NULL THEN 1 ELSE 0 END) AS COL_2_NULLS 
FROM TABLE1 

Это легко, но это может стать трудным, если вы хотите сделать это для нескольких таблиц или если одна таблица имеет много столбцов.

Я ищу способ написать запрос, который передает в него имя таблицы, а затем проходит через каждый столбец в определенной таблице (возможно, потянув имя столбца по указанию через присоединение к представлению метаданных?) И затем суммирует количество нулей в столбце. Перед тем, как кто-либо прыгнет на нидерландский победитель, пожалуйста, имейте в виду, что эта основная идея может быть использована не только для поиска нулей. Любая помощь в этом вопросе приветствуется.

+0

Для этого вам придется использовать динамический SQL. Это кажется довольно продвинутым для тех, кто описывает себя как «немного нового». –

+0

Вы можете запросить таблицу sys.columns (https://www.google.com/?gws_rd=ssl#q=sql+server+loop+columns+in+a+table), но, честно говоря, если это не произойдет для многих таблиц было бы меньше усилий, чтобы просто скопировать имена столбцов. –

+0

У меня нет ничейной вечеринки о том, что вы делаете, но вы упомянули цикл несколько раз. Оператор select не перебирает все строки. Он находит строки, соответствующие критериям. Этот тип вещей должен был бы быть выполнен с использованием динамического sql, как уже предлагал Гордон. –

ответ

1

Вам необходимо использовать динамический SQL:

declare @custom_sql varchar(max) 
set @custom_sql = 'SELECT null as first_row' 
select 
    @custom_sql = @custom_sql + ', ' + 'SUM(CASE WHEN ' + COLUMN_NAME + ' IS NULL THEN 1 ELSE 0 END) as ' + COLUMN_NAME + '_NULLS' 
from 
    INFORMATION_SCHEMA.COLUMNS where table_name = 'MYTABLE' 

set @custom_sql = @custom_sql + ' FROM MYTABLE' 

exec(@custom_sql) 

Вы также можете использовать COALESCE термин (только для нескольких иного подхода):

declare @custom_sql varchar(max) 

select 
    @custom_sql = COALESCE(@custom_sql + ', ', '') + 'SUM(CASE WHEN ' + COLUMN_NAME + ' IS NULL THEN 1 ELSE 0 END) as ' + COLUMN_NAME + '_NULLS' 
from 
    INFORMATION_SCHEMA.COLUMNS where table_name = 'users' 

set @custom_sql = 'SELECT ' + @custom_sql 

set @custom_sql = @custom_sql + ' FROM Users' 

print @custom_sql 

exec(@custom_sql) 
+0

Это решение (я использовал верхний) отлично работает для меня, теперь мне просто нужно выяснить, что именно происходит в этом скрипте, и я буду настроен. Большое спасибо! –

0

Я не знаю, как сделать общий запрос, но вы всегда можете создать сценарий, как этот

declare @sql nvarchar(max) = 'select 1 as dummy' 
select @sql = @sql + ' 
    , sum(case when [' + c.name + '] is null then 1 else 0 end) as [' + c.name + '_NULLS]' 
from sys.columns c 
join sys.tables t on t.object_id = c.object_id 
where t.name = 'TABLE1' 

set @sql = @sql + ' from TABLE1' 
select @sql 

Затем вы можете выполнить результат, например. с exec sp_executesql @sql

0

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

declare @sql nvarchar(max) 
declare @tablename nvarchar(255) = 'xxxx' 

Select @sql = ISNULL(@SQL + ',','') + ' ' + COLUMN_NAME + '_count = Sum(case when ' + COLUMN_NAME + ' is null then 1 else 0 end)' + char(13) 
From information_schema.columns 
where table_name = @tablename 

set @sql = 'Select' + @sql + ' From ' + @tablename 

print @sql 
exec sp_executesql @sql 
+0

Мне тоже нравится это, вы также можете использовать COALESCE, чтобы пропустить первую запятую. – CodeLikeBeaker

+0

Да, isnull - это специфическая функция сервера sql, тогда как COALESCE является более стандартным sql. – Jeremy

Смежные вопросы