如何在BigQuery中高效实现动态多表UNION ALL存储过程?
BigQuery 动态合并多表的存储过程实现
要实现基于可变表名数组合并数据的存储过程,核心是用动态SQL拼接UNION ALL语句,具体实现如下:
完整存储过程代码
CREATE OR REPLACE PROCEDURE MY_DATASET.merge_tables_from_array() BEGIN DECLARE dataset STRING DEFAULT "MY_DATASET"; DECLARE tablesArray ARRAY<STRING>; DECLARE union_sql STRING; -- 动态赋值表名数组,可根据需求改成从元数据读取或外部参数传入 SET tablesArray = ['TABLE_ONE','TABLE_TWO']; -- 拼接带UNION ALL的完整查询语句 SET union_sql = ARRAY_TO_STRING( ARRAY( SELECT CONCAT('SELECT * FROM `', dataset, '.', table_name, '`') FROM UNNEST(tablesArray) AS table_name ), '\nUNION ALL\n' ); -- 可选:将合并结果写入目标表 -- EXECUTE IMMEDIATE CONCAT('CREATE OR REPLACE TABLE `', dataset, '.merged_result` AS ', union_sql); -- 执行动态查询(仅查询用此句,存表则用上面的语句) EXECUTE IMMEDIATE union_sql; END;
关键逻辑说明
- 用
UNNEST遍历表名数组,为每个表生成对应的SELECT * FROM 数据集.表名语句 ARRAY_TO_STRING把所有SELECT语句用UNION ALL拼接成完整的查询SQLEXECUTE IMMEDIATE是BigQuery执行动态SQL的核心命令,用来运行拼接好的语句- 如果表结构存在差异,建议替换
SELECT *为具体列名,避免因列数/列类型不匹配报错 - 表名数组可以灵活调整,比如改成从
INFORMATION_SCHEMA.TABLES读取符合条件的表名,或者通过存储过程参数传入
内容的提问来源于stack exchange,提问作者build
相关产品推荐
相关产品推荐

