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

Snowflake中COPY INTO加载错误行的获取方案咨询

获取COPY INTO加载失败行的解决方案

问题场景

使用带转换逻辑的COPY INTO加载S3中的CSV文件到表t1,已添加ON_ERROR = CONTINUE跳过无效行,但无法通过VALIDATE函数获取失败行:
执行语句:

SELECT * FROM TABLE(VALIDATE(t1, JOB_ID => '_last'));

报错:

"Invalid argument [We couldn't find a copy for this table which occurred during this session ] for table function. Table function argument is required to be a constant."

原COPY语句:

COPY INTO t1 (
    col1,
    col2)
FROM (
    SELECT 
        t.$1 AS col1,
        t.$2 AS col2
    FROM '@STAGE/file1/' t
    ) 
file_format = (format_name = file_format_name)
ON_ERROR = CONTINUE;

解决方案

1. 显式获取COPY任务的JOB_ID后调用VALIDATE

_last仅在当前会话最近一次针对该表的COPY操作有效,若会话无匹配操作则报错,需显式获取JOB_ID:

  • 执行COPY语句后,用RESULT_SCAN获取JOB_ID:
    SELECT JOB_ID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    
  • 将JOB_ID作为常量传入VALIDATE:
    SELECT * FROM TABLE(VALIDATE(t1, JOB_ID => 'your_job_id_string'));
    
    返回结果包含失败行的错误原因、行号、原始数据等信息。

2. 通过加载历史查询JOB_ID

若会话已断开,可查询INFORMATION_SCHEMA.LOAD_HISTORY定位目标任务:

SELECT JOB_ID, START_TIME, STATUS
FROM INFORMATION_SCHEMA.LOAD_HISTORY
WHERE TABLE_NAME = 'T1'
AND START_TIME >= DATEADD(HOUR, -1, CURRENT_TIMESTAMP()) -- 按时间范围过滤
ORDER BY START_TIME DESC;

拿到JOB_ID后执行VALIDATE即可。

3. 用COPY_HISTORY函数查看复制历史

也可通过COPY_HISTORY快速获取表的最近复制任务:

SELECT * FROM TABLE(COPY_HISTORY(TABLE_NAME => 't1', START_TIME => DATEADD(HOUR, -1, CURRENT_TIMESTAMP())));

关键说明

  • VALIDATE的JOB_ID参数必须是常量字符串,不能用动态值;
  • VALIDATE返回的结果直接包含失败行的详细信息,无需通过主键对比,是更高效的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:53:09