Snowflake SQL存储过程城市参数校验失效问题求助
Snowflake存储过程城市参数校验失效问题修复
你当前的校验逻辑存在两个常见漏洞,导致无法正常拦截无效输入,以下是具体的修复方案:
问题分析
- 空值未处理:如果传入
NULL作为city_name参数,city_name NOT IN (...)的结果为UNKNOWN,IF条件不会触发,无效输入会直接绕过校验。 - 大小写敏感问题:Snowflake字符串默认大小写敏感,若传入
syd、Syd这类混合/小写的城市代码,会被判定为无效,但多数场景下需要兼容大小写不一致的输入。
修复后的代码
CREATE OR REPLACE PROCEDURE CITY_INFO(city_name VARCHAR) RETURNS STRING LANGUAGE SQL AS BEGIN -- 校验空值 + 统一大小写后校验城市代码 IF city_name IS NULL OR UPPER(city_name) NOT IN ('SYD', 'LDN', 'NYC', 'BER') THEN RETURN 'Invalid CITY NAME.'; END IF; -- 后续业务代码... END;
关键优化点
- 新增
city_name IS NULL判断:直接拦截空值输入,避免NULL绕过校验逻辑 - 使用
UPPER()统一转换:将输入参数转为大写后匹配,兼容大小写不一致的输入场景。如果需要严格区分大小写,去掉UPPER()即可 - 保留原有的
NOT IN逻辑,确保仅允许指定的四个城市代码通过校验
测试用例验证
- 有效输入:
CALL CITY_INFO('SYD')、CALL CITY_INFO('syd')(启用UPPER时)→ 正常执行后续代码 - 无效输入:
CALL CITY_INFO('PAR')、CALL CITY_INFO(NULL)→ 返回Invalid CITY NAME.
内容的提问来源于stack exchange,提问作者Rhombus
相关产品推荐
相关产品推荐

