You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从S3加载含日期文件名的CSV至Snowflake,求SQL解决方案

Snowflake动态匹配日期文件名的COPY INTO解决方案

问题原因

Snowflake的COPY INTO命令中,PATTERN参数不支持直接使用||或函数拼接生成动态匹配规则,必须传入完整的字符串常量。

解决方案

方法1:使用动态SQL执行COPY INTO

先生成包含当日日期的匹配模式字符串,再通过EXECUTE IMMEDIATE动态执行COPY INTO命令:

-- 生成当日日期对应的文件名匹配模式
SET date_pattern = CONCAT('.*EF_FILENAME_TST', TO_CHAR(CURRENT_DATE, 'YYYYMMDD'), 'T.*[.]csv');

-- 动态构建并执行COPY INTO语句
EXECUTE IMMEDIATE CONCAT('
COPY INTO table1 (
  column1,
  column2,
  column3,
  column4,
  column5,
  column6,
  column7,
  column8,
  column9
)
FROM
  (
    SELECT
      t.$1,
      t.$2,
      t.$3,
      t.$4,
      CASE
        WHEN t.$5 = ''Create'' THEN 1
        WHEN t.$5 = ''Modify'' THEN 2
        WHEN t.$5 = ''Delete'' THEN 3
      END,
      t.$6,
      t.$7,
      t.$8,
      t.$9
    FROM
      @DB_NAME.SCHEMA_NAME.S3_SF_DEV/Test/FILE/DATA AS t
  ) 
PATTERN = ''', $date_pattern, '''
FILE_FORMAT = (
  TYPE = CSV COMPRESSION = NONE SKIP_HEADER = 1 FIELD_DELIMITER = ''|'' FIELD_OPTIONALLY_ENCLOSED_BY = ''"''
);
');

方法2:创建Snowflake任务实现每日自动加载

如果需要每日自动执行加载任务,可以创建定时任务,任务中嵌入上述动态逻辑:

-- 创建每日执行的加载任务(示例为UTC时间每日凌晨1点执行)
CREATE OR REPLACE TASK load_daily_csv_task
WAREHOUSE = YOUR_WAREHOUSE_NAME -- 替换为你的仓库名称
SCHEDULE = 'USING CRON 0 1 * * * UTC'
AS
SET date_pattern = CONCAT('.*EF_FILENAME_TST', TO_CHAR(CURRENT_DATE, 'YYYYMMDD'), 'T.*[.]csv');
EXECUTE IMMEDIATE CONCAT('
COPY INTO table1 (
  column1,
  column2,
  column3,
  column4,
  column5,
  column6,
  column7,
  column8,
  column9
)
FROM
  (
    SELECT
      t.$1,
      t.$2,
      t.$3,
      t.$4,
      CASE
        WHEN t.$5 = ''Create'' THEN 1
        WHEN t.$5 = ''Modify'' THEN 2
        WHEN t.$5 = ''Delete'' THEN 3
      END,
      t.$6,
      t.$7,
      t.$8,
      t.$9
    FROM
      @DB_NAME.SCHEMA_NAME.S3_SF_DEV/Test/FILE/DATA AS t
  ) 
PATTERN = ''', $date_pattern, '''
FILE_FORMAT = (
  TYPE = CSV COMPRESSION = NONE SKIP_HEADER = 1 FIELD_DELIMITER = ''|'' FIELD_OPTIONALLY_ENCLOSED_BY = ''"''
);
');

-- 启用任务
ALTER TASK load_daily_csv_task RESUME;

注意事项

  • 替换代码中的DB_NAME、SCHEMA_NAME、YOUR_WAREHOUSE_NAME为实际的数据库、模式和仓库名称
  • 动态SQL中字符串内的单引号需要用两个单引号转义(如''Create'')
  • 任务的CRON表达式可根据需要调整执行时间

内容的提问来源于stack exchange,提问作者Jeet Chatterjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:58:13