Найти поля, которые не используются (имеют все нули)

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

Есть ли элегантный способ выяснить, какие поля в базе данных являются нулевыми для всех записей в данном наборе?

Ответы на вопрос(3)

  SELECT count(*)
  FROM table
  WHERE field IS NULL

или конечно

 SELECT SUM(CASE WHEN field IS NULL THEN 1 ELSE 0 END) AS [field is null count]
        COUNT(*) as [total count]
 FROM table

также работает, и вы можете сделать это для нескольких полей одновременно.

Похищение шаблона Аарона Бертранда:

DECLARE @tableName NVARCHAR(512)

SET @tableName = N'dbo.tablename';

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'';

SELECT @sql = @sql + N' SUM(CASE WHEN ' + QUOTENAME(name) + ' IS NULL THEN 1 ELSE 0 END) AS ['+name+' null count], '
FROM sys.columns
WHERE object_id = OBJECT_ID(@tableName) AND is_nullable = 1;

SELECT @sql = 'SELECT ' + @sql + ' Total_Count = COUNT(*)
FROM ' + @tableName + ';';

EXEC sp_executesql @sql;
 Caveatrob09 июл. 2012 г., 23:46
Мне нужно это для каждого поля в таблице. Неиспользуемые поля будут иметь значения NULL на всем протяжении набора.
 09 июл. 2012 г., 23:52
Хорошо, я добавил пример для этого тоже.
 09 июл. 2012 г., 23:52
@Caveatrob Вы путаете поля (столбцы) со строками? Что значит "через множество" имею в виду?
Решение Вопроса
DECLARE @table NVARCHAR(512);
SET @table = N'dbo.tablename';

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'';

SELECT @sql = @sql + QUOTENAME(name) 
     + ' = SUM(CASE WHEN ' + QUOTENAME(name) + ' IS NULL THEN 1 ELSE 0 END),'
  FROM sys.columns
  WHERE object_id = OBJECT_ID(@table)
  AND is_nullable = 1;

SELECT @sql = 'SELECT ' + @sql + ' Total_Count = COUNT(*)
  FROM ' + @table + ';';

EXEC sp_executesql @sql;

которые выходят 0, имеют все пустые значения (если столбец Total_Count также не выходит 0, в этом случае таблица пуста). Обратите внимание, что этот запрос будет довольно дорогим для большой таблицы.

 10 июл. 2012 г., 00:11
@ Хоган, ты думаешьCOUNT(column) не дает фактическое число? Я упомянул только 0, потому что любое значение, которое возвращает ненулевое значение, на самом деле не имеет значения, какое это число. Но это правильный номер; пожалуйста, попробуйте.
 10 июл. 2012 г., 00:05
+1, хорошо, так что это лучше, чем мой ответ, но мне все еще нравится сумма (case ..), чтобы дать фактическое число.
 20 июл. 2012 г., 14:32
@ Хоган, ваш ответ работает для устаревших типов данных больших объектов, которыеCOUNT не работает для. Я добавил быAND is_nullable = 1 в запросе, а также.
 10 июл. 2012 г., 00:14
Вы знаете, что я имел в виду под "фактическим числом нулей". Я украл ваш шаблон и закодировал его в своем ответе. : D
 10 июл. 2012 г., 00:16
Кроме того, это код 2008 года, потому что 2005 отказывается от назначения вDECLARE

которые вы можете сравнить с количеством всех записей

SELECT COUNT(*)
FROM Table1
WHERE COALESCE (Field1, Field2, etc) IS NULL

Ваш ответ на вопрос