Snowflake统计表各列NULL值的SQL实现(替代SQL Server方案)
Snowflake 自动统计表各列NULL值方案
方案一:无存储过程(优先推荐,无权限限制)
该方案利用Snowflake的EXECUTE IMMEDIATE语句自动执行动态生成的SQL,无需手动复制代码,完美适配权限受限场景。
完整代码
-- 设置目标表的数据库、Schema和表名 SET DBName = 'YOUR_DATABASE'; SET SchemaName = 'YOUR_SCHEMA'; SET TableName = 'YOUR_TABLE'; -- 拼接完整的动态查询语句(用STRING_AGG替代递归CTE,更简洁高效) SET dynamic_sql = ( SELECT STRING_AGG( 'SELECT ''' || c.column_name || ''' AS COLUMN_NAME, SUM(CASE WHEN ' || c.column_name || ' IS NULL THEN 1 ELSE 0 END) AS NULLVALUES FROM ' || $DBName || '.' || $SchemaName || '.' || $TableName, ' UNION ALL ' ) FROM information_schema.tables t JOIN information_schema.columns c ON t.table_name = c.table_name AND t.table_schema = c.table_schema WHERE t.table_name = $TableName AND t.table_schema = $SchemaName ); -- 自动执行动态SQL,直接输出结果 EXECUTE IMMEDIATE $dynamic_sql;
核心优势
- 替代原递归CTE的
STRING_AGG函数,大幅简化代码逻辑 - 全程自动完成SQL生成与执行,无需人工介入复制步骤
- 输出结果严格匹配需求格式:
COLUMN_NAME列显示列名,NULLVALUES列显示对应空值数量
方案二:存储过程方案(备用)
若权限允许,可封装为复用性更强的存储过程,支持快速查询任意表的列空值统计。
存储过程代码
CREATE OR REPLACE PROCEDURE COUNT_COLUMN_NULLS(db_name VARCHAR, schema_name VARCHAR, table_name VARCHAR) RETURNS TABLE(COLUMN_NAME VARCHAR, NULLVALUES INTEGER) LANGUAGE SQL AS $$ DECLARE dynamic_sql VARCHAR; BEGIN -- 拼接动态查询语句 dynamic_sql := ( SELECT STRING_AGG( 'SELECT ''' || c.column_name || ''' AS COLUMN_NAME, SUM(CASE WHEN ' || c.column_name || ' IS NULL THEN 1 ELSE 0 END) AS NULLVALUES FROM ' || db_name || '.' || schema_name || '.' || table_name, ' UNION ALL ' ) FROM information_schema.tables t JOIN information_schema.columns c ON t.table_name = c.table_name AND t.table_schema = c.table_schema WHERE t.table_name = table_name AND t.table_schema = schema_name ); -- 执行并返回格式化结果 RETURN TABLE(EXECUTE IMMEDIATE :dynamic_sql); END; $$;
使用方法
调用存储过程传入目标表参数即可:
CALL COUNT_COLUMN_NULLS('YOUR_DATABASE', 'YOUR_SCHEMA', 'YOUR_TABLE');
核心优势
- 一次创建可重复用于任意表,无需重复编写动态SQL
- 参数化设计,查询不同表仅需修改传入参数
- 执行结果直接返回符合要求的结构化数据
内容的提问来源于stack exchange,提问作者Rick Pack
相关产品推荐
相关产品推荐

