Snowflake cloud data platform 雪花阶段的动态文件路径

Snowflake cloud data platform 雪花阶段的动态文件路径,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我正在将数据从雪花表复制到S3外部阶段: 从复制到“@my_stage/my_folder/my_file.csv.gz” 挑选* 从我的桌子上 但是,这段代码每天都在运行,我不想覆盖我的_file.csv.gz,而是保留所有历史版本。但是,我还没有找到创建动态路径的方法: 设置stage_name=CONCAT'@my_stage/my_folder/my_file',''u date.csv.gz'; 从复制到$stage\u name 挑选* 从我的桌子上 ; 从复制到标识符$stage\

我正在将数据从雪花表复制到S3外部阶段:

从复制到“@my_stage/my_folder/my_file.csv.gz” 挑选* 从我的桌子上 但是,这段代码每天都在运行,我不想覆盖我的_file.csv.gz,而是保留所有历史版本。但是,我还没有找到创建动态路径的方法:

设置stage_name=CONCAT'@my_stage/my_folder/my_file',''u date.csv.gz'; 从复制到$stage\u name 挑选* 从我的桌子上 ; 从复制到标识符$stage\u name 挑选* 从我的桌子上 ; 后面的两个查询都不起作用!
我的问题:如何在Snowflake中创建动态舞台路径?谢谢

这行不通。不幸的是,为标识符使用变量对阶段不起作用。您可能需要使用动态SQL创建存储过程:


因此,您可以每天调用此过程,或者为path阶段、将要执行的查询和目标文件名生成具有多个参数的SP。

这不起作用。不幸的是,为标识符使用变量对阶段不起作用。您可能需要使用动态SQL创建存储过程:


因此,您可以每天调用此过程,也可以为path阶段、将要执行的查询和目标文件名生成一个包含多个参数的SP。

这是一个可以使用和修改的存储过程。请注意,用于修改copy into语句的注释行使用反勾号,而不是单引号或双引号。在JavaScript中,允许在字符串中使用单引号或双引号、多行常量和${variable_name}形式的替换标记

create or replace procedure COPY_TO_STAGE(PATH string)
returns variant
language javascript
as
$$

class Query{
    constructor(statement){
        this.statement = statement;
    }
}

// Start of main function

var out = {};

// Change your copy into statement here. 
var q = getQuery(`copy into '${PATH}' from (select * from my_table);`);

if (q.resultSet.next()) {
    out["rows_unloaded"] = q.resultSet.getColumnValue("rows_unloaded");
    out["input_bytes"] = q.resultSet.getColumnValue("input_bytes");
    out["output_bytes"] = q.resultSet.getColumnValue("output_bytes");
} else {
    out["Error"] = "Unknown error";
}

return out;

// End of main function

function getQuery(sql){
    cmd1 = {sqlText: sql};
    var query = new Query(snowflake.createStatement(cmd1));
    query.resultSet = query.statement.execute();
    return query;
}
$$;
定义后,如果需要,可以使用SQL变量作为输入:

SET stage_name=CONCAT('@my_stage/my_folder/my_file', '_date.csv.gz');

call copy_to_stage($stage_name);

这是一个可以使用和修改的存储过程。请注意,用于修改copy into语句的注释行使用反勾号,而不是单引号或双引号。在JavaScript中,允许在字符串中使用单引号或双引号、多行常量和${variable_name}形式的替换标记

create or replace procedure COPY_TO_STAGE(PATH string)
returns variant
language javascript
as
$$

class Query{
    constructor(statement){
        this.statement = statement;
    }
}

// Start of main function

var out = {};

// Change your copy into statement here. 
var q = getQuery(`copy into '${PATH}' from (select * from my_table);`);

if (q.resultSet.next()) {
    out["rows_unloaded"] = q.resultSet.getColumnValue("rows_unloaded");
    out["input_bytes"] = q.resultSet.getColumnValue("input_bytes");
    out["output_bytes"] = q.resultSet.getColumnValue("output_bytes");
} else {
    out["Error"] = "Unknown error";
}

return out;

// End of main function

function getQuery(sql){
    cmd1 = {sqlText: sql};
    var query = new Query(snowflake.createStatement(cmd1));
    query.resultSet = query.statement.execute();
    return query;
}
$$;
定义后,如果需要,可以使用SQL变量作为输入:

SET stage_name=CONCAT('@my_stage/my_folder/my_file', '_date.csv.gz');

call copy_to_stage($stage_name);

我相信你只能通过存储过程来实现这一点:我相信你只能通过存储过程来实现这一点:谢谢Greg!谢谢格雷格!