无法从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
相关产品推荐
相关产品推荐

