Могу ли я использовать системные представления для получения совокупного значения для всех столбцов таблицы?
Я нахожусь в процессе настройки таблицы, и я хочу посмотреть, сколько из 0 значений имеет каждый столбец. Я никогда раньше не использовал системные представления... могу ли я сделать что-то подобное? (это не работает, как указано, конечно, это просто передать намерение):
SELECT t.COLUMN_NAME, (SELECT COUNT(ID) FROM tblKeyStatistics t2 WHERE
t2.ColumnName = t.COLUMN_NAME AND t2.ColumnName = 0) AS CountOf0
FROM INFORMATION_SCHEMA.COLUMNS t
WHERE TABLE_NAME = 'tblKeyStatistics'
Таким образом, результат будет выглядеть так:
EntValue 2
TrailingPE 1
ForwardPE 11
При этом каждое из целых чисел равно количеству 0 значений в этом столбце таблицы.
Заранее спасибо...
1 ответ
Нет, системные представления / DMV не отслеживают значения или нулевое / не нулевое состояние для отдельных столбцов, если они не хранятся в каком-либо недокументированном месте (в чем я сомневаюсь). Чтобы получить эту информацию, вам нужно выполнить запросы к фактическим объектам. Конечно, вы можете генерировать запросы более автоматизированным способом:
DECLARE @table SYSNAME = N'dbo.tblKeyStatistics'; -- please use schema prefix
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += CHAR(13) + CHAR(10)
+ QUOTENAME(name) + ' = SUM(CASE WHEN '
+ QUOTENAME(name) + ' = 0 THEN 1 ELSE 0 END),'
FROM sys.columns
WHERE [object_id] = OBJECT_ID(@table)
-- make sure you only get numeric types:
AND system_type_id IN (48, 52, 56, 59, 60, 62, 104, 106, 108, 122, 127);
SELECT @sql = 'SELECT ' + @sql + ' TotalRows = COUNT(*)
FROM ' + @table + ';';
PRINT @sql;
--EXEC sp_executesql @sql;
Это похоже на то, что это приведет к очень дорогому запросу, но в действительности он просто выполняет сканирование кластерного индекса (очень похоже на SELECT *
сделал бы, с небольшой добавленной математикой).
Также, пожалуйста, держитесь подальше от просмотров INFORMATION_SCHEMA. Они не здоровы