Snowflake cloud data platform 获取上次数据加载查询中的验证错误时出错

Snowflake cloud data platform 获取上次数据加载查询中的验证错误时出错,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我正在使用外部后台将数据加载到snowflake。此操作在存储过程中执行,该过程从雪花任务调用。该过程使用“复制到查询”将数据加载到表中,然后检查验证错误。要获取验证错误,我使用_last作为作业id 用于将数据复制/加载到雪花表中的查询 COPY INTO conference_created_tmp FROM @conference_created_src/year=2021/month=04/day=15/hour=01/ ON_ERROR = 'SKIP_FILE' 用于获取验证错误的

我正在使用外部后台将数据加载到snowflake。此操作在存储过程中执行,该过程从雪花任务调用。该过程使用“复制到查询”将数据加载到表中,然后检查验证错误。要获取验证错误,我使用_last作为作业id

用于将数据复制/加载到雪花表中的查询

COPY INTO conference_created_tmp FROM @conference_created_src/year=2021/month=04/day=15/hour=01/ ON_ERROR = 'SKIP_FILE'
用于获取验证错误的查询:

SELECT FILE as fileName, ERROR as error
FROM table(validate(conference_created_tmp, job_id => '_last')
错误消息:

SQL编译错误:参数无效[我们找不到的副本] 此会话期间发生的此表]用于表函数。 表函数参数必须是常量

如果我直接在雪花工作表中运行copy-into命令和验证查询,它会工作!!!。但当从过程调用时,它给出了错误

程序代码:

CREATE OR REPLACE PROCEDURE TEST_ERROR_LOG()
    RETURNS STRING NOT NULL
    LANGUAGE JAVASCRIPT
AS
$$
    //Copying data from external stage to snowflake table
    const COPY_QUERY = `COPY INTO conference_created_tmp
                            FROM @conference_created_src/year=2021/month=04/day=15/hour=01/
                            ON_ERROR = 'SKIP_FILE'`;

    const LOAD_ERROR_INSERT_QUERY = `INSERT INTO error_log(eventTime, fileName, error)
                                                SELECT '%eventTime%', FILE as fileName, ERROR as error
                                                FROM table(validate(conference_created_tmp, job_id => '_last'))`;

    function log_load_error() {
        let params = {
            "%eventTime%": Date.now()
        };
        let insertQuery = LOAD_ERROR_INSERT_QUERY.replace(/%\w+%/g, function (all) {
            return params[all] || all;
        });
        try {
            snowflake.execute({sqlText: insertQuery});
        } catch (err) {
            throw err;
        }
    }

    function loadDataFromStageToTable() {
        try {
            let resultSet = snowflake.execute({sqlText: COPY_QUERY});
            resultSet.next();
        } catch (err) {
            throw err;
        }
    }

    try {
        loadDataFromStageToTable();
        log_load_error();
    } catch (err) {
        throw err;
    }

    return true;
$$

没有实际的存储过程代码是很难确定的,但我想您希望参数化表名:

SELECT FILE as fileName, ERROR as error
FROM table(validate(IDENTIFIER(:bind_variable), job_id => '_last');
如果是的话,那么你需要把它包起来

将变量绑定为标识符

IDENTIFIER( { string_literal | session_variable | bind_variable } )
文本和变量(会话或绑定)可以在任何可以通过名称识别对象的地方使用(查询、DML、DDL等)


能否提供一个复制错误的示例存储过程?