BigQuery存储过程传递表名参数报错,求正确语法
问题描述
我编写了如下存储过程:
CREATE OR REPLACE PROCEDURE `myapp.dataset.count_data`(table_name STRING, start_date DATE) BEGIN CREATE TEMP TABLE distinct_values AS ( SELECT *, LAST_VALUE(v ignore NULLS) OVER(ORDER BY id) as last_v FROM `"||table_name||"` ); ...
调用该过程时出现错误:
Invalid value: Table ""||table_name||"" must be qualified with a dataset (e.g. dataset.table).
调用时已传入带数据集限定的表名,调用语句如下:
CALL `myapp.dataset.compute_stats`( 'myapp.dataset.first_sampling', DATE(2021,1,1) )
请问传递表名作为参数的正确语法是什么?
解决方案
在BigQuery中,不能直接把字符串变量当作表名嵌入静态SQL语句,你当前写的"||table_name||"不会被解析为传入的参数值,反而被当成了字面意义上的表名,这才触发了错误。
正确做法是用动态SQL,通过EXECUTE IMMEDIATE拼接并执行包含变量的SQL语句,修改后的存储过程示例如下:
CREATE OR REPLACE PROCEDURE `myapp.dataset.count_data`(table_name STRING, start_date DATE) BEGIN DECLARE sql_query STRING; -- 用%s作为占位符,后续替换为实际表名 SET sql_query = """ CREATE TEMP TABLE distinct_values AS ( SELECT *, LAST_VALUE(v ignore NULLS) OVER(ORDER BY id) as last_v FROM `%s` ) """; -- 格式化SQL并执行 EXECUTE IMMEDIATE FORMAT(sql_query, table_name); -- 后续业务逻辑... END;
核心要点
- 用
FORMAT()函数安全拼接SQL,既避免SQL注入风险,又能正确解析表名参数 - 依靠
EXECUTE IMMEDIATE执行拼接好的动态SQL - 调用时传入的表名保持现有格式即可(完整限定名:
项目名.数据集名.表名)
内容的提问来源于stack exchange,提问作者er0
相关产品推荐
相关产品推荐

