0

我正在建立一个表格,我想看看每列有多少个 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 值的计数。

提前致谢...

4

1 回答 1

3

不,系统视图/DMV 不会跟踪单个列的值或空/非空状态,除非它们存储在某个未记录的位置(我对此表示怀疑)。要获取此信息,您需要针对实际对象运行查询。当然,您可以以更自动化的方式生成查询:

DECLARE @table sysname = N'dbo.tblKeyStatistics'; -- please use schema prefix

DECLARE @sql nvarchar(max) = N'';

SELECT @sql += CHAR(13) + CHAR(10) 
  + QUOTENAME(name) + N' =  SUM(CASE WHEN ' 
  + QUOTENAME(name) + N' = 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 = N'SELECT ' + @sql + N' TotalRows = COUNT(*) 
  FROM ' + @table + N';';

PRINT @sql;
--EXEC sys.sp_executesql @sql;

这看起来会导致非常昂贵的查询,但实际上它只是进行聚集索引扫描(很像SELECT * 会做的,只是增加了一点数学)。

也请远离 INFORMATION_SCHEMA 视图。他们不健康:

于 2012-05-01T20:34:50.270 回答