Snowflake通用ETL JS存储过程执行COPY命令未加载数据问题
Snowflake JS存储过程COPY不加载数据排查方案
你贴的代码存在核心逻辑疏漏,按以下步骤排查修复即可:
1. 先修复代码里的致命缺失
你创建了查询视图的语句对象statement1后,没有执行语句、也没有给循环用到的result_set1变量赋值,正常情况下这段代码会直接抛变量未定义的错误,如果你那边显示运行无报错,说明要么实际运行的代码和贴出的版本不一致,要么异常被静默吞掉了,循环根本没执行。
修复后的基础可运行版本:
-- 建议提前建一张日志表用来排查问题,建表语句: -- create or replace table SP_RUN_LOG(EXEC_SQL string, ROWS_LOADED number, ERR_MSG string, EXEC_TIME timestamp default current_timestamp()); var my_sql_command = "select * from vw_etl_src order by 2 asc"; var statement1 = snowflake.createStatement( {sqlText: my_sql_command} ); // 补全缺失的执行、取结果集步骤 var result_set1 = statement1.execute(); while (result_set1.next()) { var copy_sql = result_set1.getColumnValue(1); // 先把待执行的COPY语句写入日志,方便核对 snowflake.createStatement({ sqlText: `INSERT INTO SP_RUN_LOG(EXEC_SQL) VALUES ('${copy_sql.replace(/'/g,"''")}')` }).execute(); try { var copy_stmt = snowflake.createStatement({sqlText: copy_sql}); var copy_res = copy_stmt.execute(); // 读取COPY执行结果,拿到实际加载行数 copy_res.next(); var load_row_count = copy_res.getColumnValue(1); // 把加载行数写入日志 snowflake.createStatement({ sqlText: `UPDATE SP_RUN_LOG SET ROWS_LOADED = ${load_row_count} WHERE EXEC_SQL = '${copy_sql.replace(/'/g,"''")}'` }).execute(); } catch (err) { // 捕获COPY执行报错,写入日志后抛出,避免异常被吞导致无感知 snowflake.createStatement({ sqlText: `UPDATE SP_RUN_LOG SET ERR_MSG = '${err.message.replace(/'/g,"''")}' WHERE EXEC_SQL = '${copy_sql.replace(/'/g,"''")}'` }).execute(); throw err; } }
2. 逐项核对以下配置
- 校验视图输出合法性:单独在工作表执行
select * from vw_etl_src order by 2 asc,把返回的COPY语句复制出来手动执行,确认语句本身没有语法错误、stage路径正确、文件存在、目标表名拼写正确。 - 检查COPY加载历史:执行以下SQL查看最近24小时目标表的COPY记录,确认文件是被跳过了还是加载了0行:
SELECT * FROM TABLE(INFORMATION_SCHEMA.COPY_HISTORY( TABLE_NAME => 'ETL_DB.EOD_DATA', START_TIME => DATEADD(HOUR, -24, CURRENT_TIMESTAMP()) )) ORDER BY LAST_LOAD_TIME DESC;
如果STATUS列显示SKIPPED,说明对应文件已经被加载过,Snowflake默认不会重复加载,需要在COPY语句末尾加FORCE = TRUE参数强制加载。
- 校验权限链路:确认存储过程的所有者角色,同时拥有
vw_etl_src视图的读权限、@myint_stage的USAGE/READ权限、etl_db.eod_data表的INSERT权限,EXECUTE AS OWNER配置下存储过程会使用所有者的权限执行操作,只要所有者权限齐备就不会有权限问题。 - 检查文件格式配置:确认COPY语句里指定的文件格式和你上传的csv.gz文件匹配,比如分隔符、编码、跳过行数、是否存在表头,格式不匹配会导致加载0行且不抛错的情况。
内容的提问来源于stack exchange,提问作者nick_leeson
相关产品推荐
相关产品推荐

