在语句的阶段或位置部分定义路径的语法COPY INTO
不允许函数在 SQL 中动态定义它。
但是,您可以使用存储过程来完成构建动态查询,使用JavaScript 日期 API和一些字符串格式。
这是您的用例的一个非常简单的示例,其中一些代码改编自另一个问题:
CREATE OR REPLACE PROCEDURE COPY_INTO_PROCEDURE_EXAMPLE()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var rows = [];
var n = new Date();
// May need refinement to zero-pad some values or achieve a specific format
var datetime = `${n.getFullYear()}-${n.getMonth() + 1}-${n.getDate()}-${n.getHours()}-${n.getMinutes()}-${n.getSeconds()}`;
var st = snowflake.createStatement({
sqlText: `COPY INTO '@s3bucket/${datetime}_something.csv.gz' FROM (SELECT * FROM mytable) FILE_FORMAT=(TYPE=CSV FIELD_OPTIONALLY_ENCLOSED_BY='"' COMPRESSION='gzip') SINGLE=TRUE HEADER=TRUE;`
});
var result = st.execute();
result.next();
rows.push(result.getColumnValue(1))
return rows;
$$
要执行,请运行:
CALL COPY_INTO_PROCEDURE_EXAMPLE();
以上缺少完善的日期格式处理(零填充月、日、小时、分钟、秒)、错误处理(如果COPY INTO
失败)、输入查询的参数化等,但它应该给出一个关于如何实现这一点的总体思路。