MS SQL Server如何按列统计指定表各字段NULL值并透视返回结果
MS SQL Server 动态统计表各列NULL值数量实现方案
完全不需要逐列手写UNION语句,通过系统视图INFORMATION_SCHEMA.COLUMNS读取表的列元数据,动态拼接统计逻辑即可,适配SSMS所有主流SQL Server版本。
高版本通用写法(SQL Server 2017及以上)
利用STRING_AGG快速拼接统计语句,替换代码中库名、schema、表名参数后直接执行,即可返回column_name、null_count两列的统计结果:
-- 替换下方三个变量为实际业务值 DECLARE @DatabaseName NVARCHAR(128) = N'你的目标数据库名' DECLARE @SchemaName NVARCHAR(128) = N'dbo' DECLARE @TableName NVARCHAR(128) = N'你的目标表名' DECLARE @ExecSQL NVARCHAR(MAX) SELECT @ExecSQL = STRING_AGG( N'SELECT ''' + COLUMN_NAME + ''' AS column_name, SUM(CASE WHEN ' + QUOTENAME(COLUMN_NAME) + N' IS NULL THEN 1 ELSE 0 END) AS null_count FROM ' + QUOTENAME(@DatabaseName) + N'.' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName), N' UNION ALL ' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = @DatabaseName AND TABLE_SCHEMA = @SchemaName AND TABLE_NAME = @TableName -- 可先打印生成的SQL校验逻辑,确认无误后再执行 PRINT @ExecSQL EXEC sp_executesql @ExecSQL
低版本兼容写法(SQL Server 2016及更早)
低版本没有STRING_AGG函数,可通过FOR XML PATH实现字符串拼接,逻辑和返回结果和高版本写法完全一致:
DECLARE @DatabaseName NVARCHAR(128) = N'你的目标数据库名' DECLARE @SchemaName NVARCHAR(128) = N'dbo' DECLARE @TableName NVARCHAR(128) = N'你的目标表名' DECLARE @ExecSQL NVARCHAR(MAX) SELECT @ExecSQL = STUFF(( SELECT N' UNION ALL SELECT ''' + COLUMN_NAME + ''' AS column_name, SUM(CASE WHEN ' + QUOTENAME(COLUMN_NAME) + N' IS NULL THEN 1 ELSE 0 END) AS null_count FROM ' + QUOTENAME(@DatabaseName) + N'.' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = @DatabaseName AND TABLE_SCHEMA = @SchemaName AND TABLE_NAME = @TableName FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 11, '') PRINT @ExecSQL EXEC sp_executesql @ExecSQL
注意事项
- 用
UNION ALL替代原生写法里的UNION,因为每段统计的列名唯一,不需要去重,执行效率更高 - 所有标识符用
QUOTENAME()包裹,避免列名、表名包含空格、特殊字符、SQL关键字时执行报错 - 如果需要调整统计逻辑(比如同时统计空字符串数量),只需要修改拼接模板里的CASE判断逻辑即可,所有列会自动适配新规则
内容的提问来源于stack exchange,提问作者kevo31415
相关产品推荐
相关产品推荐

