Могу ли я использовать системные представления для получения совокупного значения для всех столбцов таблицы?

Я нахожусь в процессе настройки таблицы, и я хочу посмотреть, сколько из 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. Они не здоровы

http://blog.sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx

Другие вопросы по тегам