如何修改Snowflake JS存储过程支持任意数量入参动态生成UNION目标表
Snowflake存储过程动态适配任意数量schema合并的解决方案
你只需要把硬编码取前3个表、拼接UNION ALL的逻辑改为动态遍历所有匹配到的表即可,修改后完整代码如下:
CREATE OR REPLACE PROCEDURE SP_test (c_names varchar) RETURNS STRING LANGUAGE JAVASCRIPT AS $$ var results_array = []; // 原入参拼接IN条件逻辑保留 var c_names_combined = "'" + C_NAMES.split(',').join("','") + "'" let sql_command = `SELECT TABLE_CATALOG||'.'||TABLE_SCHEMA||'.'||TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='MAP_MEMBER_PLATFORM'` sql_command = sql_command + ` AND TABLE_SCHEMA IN (` + c_names_combined +`)` let sqlStmt = snowflake.createStatement( {sqlText: sql_command} ); let result_sqlStmt = sqlStmt.execute(); while (result_sqlStmt.next()) { let full_table_name = result_sqlStmt.getColumnValue(1); // 移除多余的数组嵌套,直接存储全量表名字符串 results_array.push(full_table_name); } // 新增边界判断:无匹配表时直接返回提示,避免SQL报错 if (results_array.length === 0) { return "未匹配到任何符合条件的表,未创建目标表"; } // 动态拼接所有表的UNION ALL逻辑 let select_segments = results_array.map(table => `SELECT * FROM ${table}`); let union_all_sql = select_segments.join(' UNION ALL '); // 拼接完整建表语句执行 let create_table_sql = `CREATE OR REPLACE TABLE table_to_create AS ${union_all_sql}`; sqlStmt = snowflake.createStatement( {sqlText: create_table_sql} ); sqlStmt.execute(); return `done,共合并${results_array.length}张表` $$; -- 支持传入任意数量的schema参数 call SP_test('A,B,C,D,E,F');
核心修改点:
- 移除硬编码的c_1、c_2、c_3变量,不再限制最多合并3张表
- 调整匹配表结果的存储结构,去掉多余的数组嵌套便于后续处理
- 新增无匹配表的容错逻辑,避免执行无效SQL报错
- 通过数组的map、join方法自动生成所有表的UNION ALL拼接逻辑,支持任意数量的匹配表合并
- 返回结果新增合并表数量提示,方便校验执行结果
内容的提问来源于stack exchange,提问作者Puspa Bista
相关产品推荐
相关产品推荐

