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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:27:51