Найти неиспользуемые столбцы в SQL - PullRequest
0 голосов
/ 25 сентября 2019

Существует база данных, к которой у меня нет доступа для создания хранимых процедур или изменения какой-либо части.В нем есть таблицы с МНОГИМИ столбцами, и многие из этих столбцов, по-видимому, не используются.

Я хотел бы увидеть, какие столбцы используются, а какие нет (каждая строка имеет значение NULL в этом столбце).

Я знаю, что мог бы сделать вручную:

SELECT COUNT([columnX])
FROM [table]

для каждого отдельного столбца, в каждой отдельной таблице, о которой я хотел бы знать, но есть сотни таблицы, каждая из которых может содержать сотен столбцов.(Одна таблица содержит 786 столбцов.)

Есть ли лучший способ найти то, что мне нужно, с помощью имеющихся у меня разрешений, без создания процедур, установки каких-либо инструментов и т. Д.

(База данных находится на SQL Server 2012).

1 Ответ

0 голосов
/ 27 сентября 2019

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

Это характерно для одной таблицы (здесь она называется specifictable), потому что яв то время интересовались только столбцами определенных таблиц, и было проще изменить имя таблицы в двух местах, чем заставить запрос делать все самому.

Сначала мы объявляем некоторые переменные, получаем количествоиз всех строк из specifictable:

DECLARE @sql NVARCHAR(MAX) = N'';
DECLARE @tot INT;
SELECT @tot = COUNT(*) FROM specifictable;

Затем мы объединяем вместе большой оператор SQL UNION, разделенный символами новой строки (CHAR(13) + CHAR(10)).Он выбирает имя столбца, его порядок в таблице, количество строк со значением в этом столбце и процент всех строк, которые есть.

SELECT @sql += ' UNION ' + CHAR(13) + CHAR(10) 
    + 'SELECT '
        + '''' + COLUMN_NAME + ''' as Col, ' + ORDINAL_POSITION + ' as OrdinalPosition, '
        + ' count(' + COLUMN_NAME + ') as NumWithVal, '
        + '(count(' + COLUMN_NAME + ') / CAST(' + CAST(@tot as varchar(20)) + ' as decimal) * 100) as Percnt '
    + 'FROM ' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'specifictable';

Поскольку перед каждым отдельным SELECT добавляется UNION, мы обрезаем всю первую строку, которая содержит только «UNION», а затем добавляем ORDER BY.

SELECT @sql = SUBSTRING(@sql, CHARINDEX(char(10), @sql), LEN(@sql))     -- remove first line (extra union)
SELECT @sql += CHAR(13) + CHAR(10) + 'ORDER BY 3 DESC, ORDINAL_POSITION'

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

EXEC sp_executesql @sql;
...