Snowflake Scripting中在SELECT语句WHERE子句使用已声明变量触发EXPRESSION_ERROR报错的问题咨询
Snowflake Scripting中在SELECT语句WHERE子句使用已声明变量触发EXPRESSION_ERROR报错的问题咨询
我太懂你从T-SQL转Snowflake Scripting时的这种困惑了——这俩在变量引用规则上的差异,刚好踩中了你现在的坑,才触发了这个EXPRESSION_ERROR。
报错原因分析
你代码里的问题出在第二个SELECT子查询的WHERE子句:WHERE FISCAL_YEAR = MaxPriorYear。在Snowflake里,当你在SQL语句(比如这个子查询)里直接写MaxPriorYear时,它会默认把这个名字当成TBL_MAIN表的列名来查找,但你的表显然没有这个列,所以直接就报了SQL编译错误。这和T-SQL里可以直接在批处理里引用变量的逻辑不一样,Snowflake的SQL执行上下文和Scripting变量上下文是分开的,你必须明确告诉它你用的是脚本里的变量,不是表字段。
修复后的代码
只需要在引用脚本变量的地方加上冒号:,就能让Snowflake识别出这是你之前声明的Scripting变量了:
DECLARE MaxPriorYear NUMBER; MaxPriorMonth NUMBER; BEGIN MaxPriorYear := (SELECT MAX(FISCAL_YEAR) FROM TBL_MAIN); -- 给变量前加冒号,明确这是Scripting上下文的变量 MaxPriorMonth := (SELECT MAX(ACCOUNTING_PERIOD) FROM TBL_MAIN WHERE FISCAL_YEAR = :MaxPriorYear); RETURN MaxPriorMonth; END;
额外优化方案
如果你想更高效,也可以用一个联合查询一次性获取这两个值,避免分步赋值:
DECLARE MaxPriorYear NUMBER; MaxPriorMonth NUMBER; BEGIN SELECT MAX(FISCAL_YEAR), MAX(ACCOUNTING_PERIOD) INTO MaxPriorYear, MaxPriorMonth FROM TBL_MAIN WHERE FISCAL_YEAR = (SELECT MAX(FISCAL_YEAR) FROM TBL_MAIN); RETURN MaxPriorMonth; END;
不过这种写法和你原来的分步逻辑结果一致,看你个人习惯选择就行。
总之记住:在Snowflake Scripting的SQL语句里引用脚本变量,一定要加冒号:做区分——这是和T-SQL最不一样的地方之一,适应了就好啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

