Snowflake转换SQL代码时遇'CURR_DATE'无效标识符错误求助
问题分析
你遇到的invalid identifier 'CURR_DATE'错误,核心原因是独立的DECLARE语句未被纳入合法的脚本块。Snowflake中DECLARE不能作为单独语句执行,必须属于BEGIN...END组成的脚本块结构,否则变量无法被后续代码识别。
另外原代码存在冗余的类型转换,且混合使用会话变量(SET)与局部变量的方式不够规范,也可能引发上下文识别问题。
修正方案
以下提供两种可行的修正版本:
方案1:使用局部变量(推荐)
将所有变量定义纳入脚本块的DECLARE段,结构更清晰且符合Snowflake脚本规范:
DECLARE pfd TIMESTAMP := CURRENT_TIMESTAMP; psd DATE := DATEADD(DAY, -30, CURRENT_TIMESTAMP); curr_date TIMESTAMP; BEGIN curr_date := psd; WHILE curr_date < pfd DO INSERT INTO census_9am (census_dtm) VALUES (DATEADD(MINUTE, 540, curr_date)); -- 转换为当日9点(540分钟=9*60) curr_date := DATEADD(DAY, 1, curr_date); END WHILE; END;
方案2:保留会话变量+脚本块包裹
若需保留会话变量,需用EXECUTE IMMEDIATE将脚本逻辑包裹为完整块:
SET pfd = CURRENT_TIMESTAMP; SET psd = DATEADD(DAY, -30, CURRENT_TIMESTAMP)::DATE; EXECUTE IMMEDIATE $$ DECLARE curr_date TIMESTAMP; BEGIN curr_date := $psd; WHILE curr_date < $pfd DO INSERT INTO census_9am (census_dtm) VALUES (DATEADD(MINUTE, 540, curr_date)); -- 转换为当日9点 curr_date := DATEADD(DAY, 1, curr_date); END WHILE; END; $$;
额外注意事项
- 确保Snowflake工作表处于SQL Scripting模式(而非Classic SQL),可通过工作表右上角的模式切换下拉框确认。
DATETIME在Snowflake中是TIMESTAMP_NTZ的别名,直接使用TIMESTAMP类型更符合官方推荐规范。
内容的提问来源于stack exchange,提问作者user1371482
相关产品推荐
相关产品推荐

