如何用Snowflake SQL存储过程实现字段去重计数的数据质量检查?
Snowflake SQL存储过程实现列去重计数的修正方案
原代码的问题
- 动态SQL拼接语法错误:
COUNT(DISTINCT后缺少空格,且列名未做标识符转义(若列名含特殊字符/关键字会直接报错) - 无法直接将
EXECUTE IMMEDIATE的结果集赋值给变量:必须通过RESULT_SCAN工具函数获取执行结果 - 返回类型定义不合理:计数属于数值类型,没必要用STRING类型承载
修正后的存储过程代码
create or replace procedure DQ_CHECK(table_name string, col_name string) returns number language sql as $$ declare query_str string; result_scan_id string; distinct_count number; begin -- 拼接动态SQL,给列名和表名加双引号处理特殊标识符 query_str := 'SELECT COUNT(DISTINCT "' || col_name || '") AS distinct_count FROM "' || table_name || '"'; -- 执行动态SQL并获取结果集ID execute immediate :query_str; result_scan_id := last_query_id(); -- 从结果集中提取计数值 select distinct_count into distinct_count from table(result_scan(:result_scan_id)); return distinct_count; end; $$;
调用示例
call DQ_CHECK('数据库名.模式名.表名', '目标列名');
关键说明
- 标识符转义:给表名和列名添加双引号,避免因名称含空格、特殊字符或与关键字冲突导致报错
- 结果集处理:
EXECUTE IMMEDIATE执行后,用LAST_QUERY_ID()获取查询ID,再通过RESULT_SCAN()函数读取执行结果 - 返回类型调整:改用
NUMBER类型直接返回计数值,更贴合业务逻辑
内容的提问来源于stack exchange,提问作者Aditya Lingam
相关产品推荐
相关产品推荐

