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

Airflow中调用Snowflake存储过程执行失败求助

Airflow调用Snowflake存储过程触发JavaScript编译错误的解决方法

问题描述

在Snowflake中可正常运行的存储过程dynamic_view_on_table_sp('DIM_LEXIDS_PROVIDER'),放到Airflow DAG中执行时触发以下JavaScript编译错误:

JavaScript compilation error: Uncaught SyntaxError: Invalid or unexpected token in DYNAMIC_VIEW_ON_TABLE_SP at '                      create_statement += "' position 42

尝试在SQL语句不同位置使用反引号和双引号,问题仍未解决。以下是Snowflake中可正常运行的存储过程代码:

create or replace procedure dynamic_view_on_table_sp(TABLEPREFIX VARCHAR)
            returns STRING
            language javascript
            as     
            $$
              var get_tables_name_stmt = "select table_name from information_schema.tables where table_type = 'BASE TABLE' and table_name like UPPER('"+ TABLEPREFIX + "%');"
              var get_tables_name_stmt = snowflake.createStatement({sqlText:get_tables_name_stmt });
              var tables = get_tables_name_stmt.execute();
              var row_count = get_tables_name_stmt.getRowCount();
              var cnt = 0; 
              var create_statement = `create or replace view dim_full_segment_lexids_tables_vw as \n`;
              while (tables.next())  {
                  cnt += 1;
                  var table_name = tables.getColumnValue(1); 
                  create_statement += `select * from ` + table_name 
                  if (cnt < row_count){
                      create_statement += "\n union all \n"
                  }
               }
              var create_view_statement = snowflake.createStatement( {sqlText: create_statement} );
                create_view_statement.execute();
              return create_view_statement.getSqlText();
            $$;

问题原因

错误信息里的"是HTML实体转义后的双引号。存储过程代码中用"替代双引号,在Snowflake环境中能正常解析,但Airflow在传递SQL代码时,会把这些"当成字符串的一部分,导致JavaScript语法解析失败,触发Invalid token错误。

解决方案

核心修改思路

替换代码中所有的"为实际的引号,改用ES6模板字符串(反引号)处理SQL语句,避免引号嵌套和转义冲突。

修改后的存储过程代码

create or replace procedure dynamic_view_on_table_sp(TABLEPREFIX VARCHAR)
returns STRING
language javascript
as     
$$
  // 用模板字符串重构SQL查询,直接通过${}拼接变量
  var get_tables_name_stmt = `select table_name from information_schema.tables where table_type = 'BASE TABLE' and table_name like UPPER('${TABLEPREFIX}%');`;
  var get_tables_name_stmt = snowflake.createStatement({sqlText:get_tables_name_stmt });
  var tables = get_tables_name_stmt.execute();
  var row_count = get_tables_name_stmt.getRowCount();
  var cnt = 0; 
  var create_statement = `create or replace view dim_full_segment_lexids_tables_vw as \n`;
  
  while (tables.next())  {
      cnt += 1;
      var table_name = tables.getColumnValue(1); 
      create_statement += `select * from ` + table_name;
      // 用模板字符串处理换行和UNION ALL,避免转义问题
      if (cnt < row_count){
          create_statement += `\n union all \n`;
      }
   }
  
  var create_view_statement = snowflake.createStatement( {sqlText: create_statement} );
  create_view_statement.execute();
  return create_view_statement.getSqlText();
$$;

关键修改点

  1. 将原本用&quot;拼接的SQL字符串,全部替换为ES6模板字符串(反引号),通过${TABLEPREFIX}直接注入变量,彻底避免引号嵌套转义问题。
  2. 替换所有&quot;为模板字符串或双引号,确保JavaScript代码语法合法。
  3. 补全语句末尾的分号,保持代码语法规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:31:11