如何在Snowflake存储过程中使用CTE?附报错示例及疑问
Snowflake SQL存储过程中CTE赋值ResultSet的语法修正
你的问题出在Snowflake SQL存储过程里,将带CTE的查询赋值给resultset变量的语法不符合要求。直接在BEGIN块里写WITH子句后接赋值语句,解析器无法正确识别,必须把包含CTE的整个查询用括号包裹,作为一个完整的表达式赋值给变量。
修正后的代码如下:
CREATE OR REPLACE PROCEDURE example_procedure() RETURNS TABLE (example_col STRING) LANGUAGE SQL AS $$ DECLARE res resultset; BEGIN res := ( WITH sample_cte AS ( SELECT 'data' AS example_col ) SELECT example_col FROM sample_cte ); return table(res); END; $$;
为什么原来的写法会报错?
Snowflake的SQL存储过程语法要求,当把查询结果赋值给resultset变量时,查询语句必须是一个完整的表达式。你原来的写法把WITH子句和赋值操作分开,解析器会把WITH子句当作独立的语句处理,而不是赋值表达式的一部分,因此触发语法错误。将整个CTE查询用括号包裹后,就变成了一个可以赋值给resultset的合法表达式,完全无需使用execute immediate拼接字符串。
调用CALL example_procedure();就能正常返回结果。
内容的提问来源于stack exchange,提问作者davemyron
相关产品推荐
相关产品推荐

