Snowflake存储过程中带WHERE子句的SELECT赋值变量报错求助
解决Snowflake存储过程WHERE条件语法错误问题
错误原因:
- 字符串赋值时单引号转义逻辑错误:你用双层双单引号包裹SQL语句及内部字符串,导致解析器无法正确识别语法边界。
- 变量
v_RowCount未在声明段定义,会触发编译错误。
修正后的代码
CREATE OR REPLACE PROCEDURE Employee_sp() RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE v_Query VARCHAR; v_RowCount INTEGER; -- 补充变量声明 BEGIN -- 正确转义内部单引号:外层用单引号包裹整个SQL,内部字符串用两个单引号转义 v_Query:= 'CREATE OR REPLACE TEMPORARY TABLE EMP_TMP AS SELECT COUNT(*) FROM EMPLOYEE WHERE EMP_NAME IN (''NAME1'',''NAME2'',''NAME3'',''NAME4'')'; EXECUTE IMMEDIATE :v_Query; v_RowCount := (SELECT COUNT(*) FROM EMP_TMP); RETURN v_RowCount; END; $$;
更安全的替代方案(避免SQL注入)
使用数组结合FLATTEN函数替代字符串拼接,既安全又便于维护:
CREATE OR REPLACE PROCEDURE Employee_sp() RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE v_RowCount INTEGER; v_target_names ARRAY := ['NAME1', 'NAME2', 'NAME3', 'NAME4']; BEGIN CREATE OR REPLACE TEMPORARY TABLE EMP_TMP AS SELECT COUNT(*) FROM EMPLOYEE WHERE EMP_NAME IN (SELECT VALUE FROM TABLE(FLATTEN(input => :v_target_names))); v_RowCount := (SELECT COUNT(*) FROM EMP_TMP); RETURN v_RowCount; END; $$;
内容的提问来源于stack exchange,提问作者BalajiAWS
相关产品推荐
相关产品推荐

