当 运行 copy/merge from stage in Snowflake 时,有没有办法将子查询结果用作模式?

Is there a way to use subquery result as a pattern when running copy/merge from stage in Snowflake?

我需要根据以日期开头的文件名按文件名模式进行过滤,以将新数据从 S3 合并到 Snowflake。

MERGE INTO tablename
USING
    (
        SELECT *
        FROM '@s3bucketname/'  
        (file_format  => PARQUET, pattern=>'.*20220127.*.parquet')  
)
    ...
;

这很好用,但我需要更新日期。 我可以使用此子查询获得正确的模式字符串:

select concat('.*', regexp_replace(current_date(),'-',''), '.*.parquet' );

但由于“Table 函数参数必须是常量”,我需要将它作为一个单独的变量。如果我将它设置为变量,它可以工作,但使用 CTE 如下:

MERGE INTO tablename
USING
( with filename_date as (select concat('.*', regexp_replace(current_date(),'-',''), '.*.parquet' ))
    SELECT *
        FROM '@s3bucketname/'  
        (file_format  => PARQUET, pattern=>filename_date )  
)
    ...
;

不起作用。 有没有办法在合并中设置它并避免创建单独的会话变量?

Is there a way to set it within the merge and avoid making a separate session variable?

不,没有办法。正如您提到的,模式参数希望您提供一个常量。即使您输入 filename_date,它也会将其接受为 'filename_date',而不是变量。

您可以编写存储过程来计算日期并使用此日期作为舞台对象的模式执行动态 SQL。