You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow Snowflake Operator调试:动态日期CTE与JSON变量展开问题

问题分析:Snowflake SQL编译错误(parse error near )

问题描述

在SQL文件中定义了多个变量并运行CTE,但无法定位问题。设置了日期范围变量,还有一个存储JSON对象的变量(后续将展开用作变量列表),怀疑问题与引号标识符有关。从Airflow收到如下SQL编译错误:

SQL compilation error:
parse error line 5 at position 65 near ''

无法在报错提示的行/位置找到问题,以下是简化后的脚本示例:

SET MAX_DATE =
(
    SELECT 
            CASE WHEN DATEDIFF(DAY, SALES_DATE, CURRENT_DATE()) > 7
                THEN DATEADD(DAY, 7, SALES_DATE)
                ELSE SALES_DATE
            END
    FROM SALES
    LIMIT 1
);

SET MIN_DATE = DATEADD(WEEK, -52, $MAX_DATE);

SET KEY_STORES = 
    '["STORE A","STORE B","STORE C","STORE D"]'
;


WITH SALES AS 
(
    SELECT  *
    FROM    SALES_ORDERS SO
    WHERE 
            SO.SALES_DATE BETWEEN $MIN_DATE AND $MAX_DATE
),

STORES AS
(
    SELECT
            VALUE::VARCHAR(50) AS STORE_NAME
    FROM    TABLE(FLATTEN(INPUT => PARSE_JSON($KEY_STORES)))
)

SELECT
        *
FROM    SALES
INNER JOIN STORES 
        ON SALES.STORE = STORES.STORE_NAME
;

问题原因及解决方案

核心原因:CTE与原表命名冲突

你的CTE命名为SALES,但在MAX_DATE的子查询中也引用了FROM SALES。Snowflake解析器按从上到下顺序处理语句,执行SET MAX_DATE时,后续的CTESALES还未定义,但解析器会优先识别同名的CTE,导致找不到对应的表定义,进而触发<EOF>解析错误——这也是报错指向行5附近的原因(该行属于FROM SALES所在的子查询)。

其他次要可能原因

  • JSON字符串转义问题:原代码中使用&quot;转义引号,Airflow传递SQL时可能因转义处理不当导致解析中断,建议直接使用双引号并以单引号包裹整个JSON字符串(如示例修改后的写法)。
  • 变量定义格式问题:部分Snowflake版本对多行子查询的SET语句解析敏感,可将子查询压缩为单行以避免格式问题。

修正后的脚本示例

SET MAX_DATE = (SELECT CASE WHEN DATEDIFF(DAY, SALES_DATE, CURRENT_DATE()) > 7 THEN DATEADD(DAY, 7, SALES_DATE) ELSE SALES_DATE END FROM SALES LIMIT 1);

SET MIN_DATE = DATEADD(WEEK, -52, $MAX_DATE);

SET KEY_STORES = '["STORE A","STORE B","STORE C","STORE D"]';

-- 修改CTE名称,避免与原表SALES重名
WITH SALES_CTE AS 
(
    SELECT  *
    FROM    SALES_ORDERS SO
    WHERE 
            SO.SALES_DATE BETWEEN $MIN_DATE AND $MAX_DATE
),

STORES AS
(
    SELECT
            VALUE::VARCHAR(50) AS STORE_NAME
    FROM    TABLE(FLATTEN(INPUT => PARSE_JSON($KEY_STORES)))
)

SELECT
        *
FROM    SALES_CTE
INNER JOIN STORES 
        ON SALES_CTE.STORE = STORES.STORE_NAME;

内容的提问来源于stack exchange,提问作者Bryan Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:43:23