如何识别SQL Server潜在非空列并统计可空列的空值数量?
针对SQL Server非空列相关问题的解决方案
1. 如何找出潜在的非空列?
潜在的非空列指的是定义上允许为空,但实际数据里从未出现过空值的列。要定位这类列,核心就是统计每个可空列的空值数量,筛选出空值数为0的结果就行——下面的脚本能直接帮你搞定,还能顺带拿到全量的空值统计数据。
2. 扫描所有可空列,筛选无空值列或统计空值数量
直接上实用的动态SQL脚本,它会自动遍历数据库里所有用户表的可空列,生成统计语句并执行,最终返回每个列的空值明细:
DECLARE @SQL NVARCHAR(MAX) = N''; SELECT @SQL += N' SELECT ''' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ''' AS [表名], ''' + QUOTENAME(c.name) + ''' AS [列名], COUNT(*) - COUNT(' + QUOTENAME(c.name) + ') AS [空值数量], COUNT(*) AS [总行数] FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' UNION ALL' FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE c.is_nullable = 1 -- 只筛选允许为空的列 AND t.is_ms_shipped = 0; -- 排除系统自带的表 -- 去掉最后多余的UNION ALL SET @SQL = LEFT(@SQL, LEN(@SQL) - 10); EXEC sp_executesql @SQL;
脚本说明:
- 借助
sys.tables、sys.columns、sys.schemas这几个系统视图,我们能轻松拿到所有用户表和可空列的元数据 COUNT(*) - COUNT(列名)是计算空值的小技巧:COUNT(*)统计表的总行数,COUNT(列名)会自动忽略空值,两者相减就是该列的空值总数- 执行后会返回清晰的结果集,你可以直接筛选
空值数量 = 0的行,这些就是完全可以考虑添加非空约束的列
想快速定位无空值的可空列?可以用这个简化版脚本:
DECLARE @SQL NVARCHAR(MAX) = N''; SELECT @SQL += N' IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' WHERE ' + QUOTENAME(c.name) + ' IS NULL) BEGIN PRINT ''表: ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ',列: ' + QUOTENAME(c.name) + ' 无空值,可添加非空约束''; END' FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE c.is_nullable = 1 AND t.is_ms_shipped = 0; EXEC sp_executesql @SQL;
它会直接打印出所有符合条件的列,帮你快速锁定目标。
添加非空约束的小提醒:
找到目标列后,添加约束的语句很简单,推荐用指定约束名称的方式(更规范):
ALTER TABLE [架构名].[表名] ADD CONSTRAINT [CK_表名_列名_非空] CHECK ([列名] IS NOT NULL);
或者直接修改列属性:
ALTER TABLE [架构名].[表名] ALTER COLUMN [列名] [对应数据类型] NOT NULL;
内容的提问来源于stack exchange,提问作者Inverted Llama
相关产品推荐
相关产品推荐

