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
相关产品推荐
相关产品推荐

