通过将列和表名作为参数传递来创建 BigQuery 存储过程
Posted
技术标签:
【中文标题】通过将列和表名作为参数传递来创建 BigQuery 存储过程【英文标题】:Creating BigQuery Stored Procedure by passing column and table name as parameters 【发布时间】:2020-07-03 08:04:41 【问题描述】:我正在尝试创建 BigQuery 存储过程,它将接受列和表名作为参数。 这是正在运行的查询:
EXECUTE IMMEDIATE (
''' SELECT
''' || (SELECT STRING_AGG(DISTINCT "MAX(IF(PROPERTY_KEY = '" || PROPERTY_KEY || "', a.RANK, NULL)) AS " || PROPERTY_KEY)
FROM `project.dataset.table` x
) || '''
FROM (
select "1" AS GroupbyCol,
PROPERTY_KEY ,
rank() over (order by PROPERTY_KEY ) AS RANK
from (
select distinct PROPERTY_KEY
from `project.dataset.table`
)
) a GROUP BY GroupbyCol
''')
我尝试如下创建存储过程:
CREATE OR REPLACE PROCEDURE `project.dataset.test_stored_procedure_ne`
(table_name STRING,
destination_table STRING,
row_ids STRING,
pivot_col_name STRING,
pivot_col_value STRING,
aggregation STRING)
BEGIN
DECLARE header STRING;
EXECUTE IMMEDIATE (
"SELECT
''' || (SELECT STRING_AGG(DISTINCT "MAX(IF(@pivot_col_name = '" || @pivot_col_name || "', a.RANK, NULL)) AS " || @pivot_col_name)
FROM `table_name` x
) || '''
FROM (
select "1" AS GroupbyCol,
@pivot_col_name ,
rank() over (order by @pivot_col_name ) AS RANK
from (
select distinct @pivot_col_name
from `table_name`
)
) a GROUP BY GroupbyCol
") header
USING pivot_col_name AS pivot_col_name
END;
调用 SP 为:
CALL `project.dataset.test_stored_procedure_ne`(
'project.dataset.InputTbl' #table_name
, 'project.dataset.outputTbl' #destination_table
, 'Id' #row_id
, 'PROPERTY_KEY' # column name
, 'PROPERTY_VALUE' #column value
, 'MAX' #aggregation if any
);
得到错误:
Error validating procedure body (add OPTIONS(strict_mode=false) to suppress): Query error: Invalid value: Table name "table_name" missing dataset while no default dataset is set in the request.
请解释如何以及何时添加我认为放错地方的引号
【问题讨论】:
您是否指定了数据集名称?您应该从project-id.dataset_id.table_name
或dataset_id.table_name
查询
我注意到您没有将表名传递给查询,并且执行直接括号没有关闭,
我在使用 CALL() 调用过程时传递 table_name,第一个参数是 'project.dataset.InputTbl'
@Felipe 在您从事存储过程工作时能否提供帮助
看起来您正在尝试复制已有的内容 - 请参阅 Easy pivot() in BigQuery, in one step 中的 How-to。从那篇文章中,我希望您会意识到您需要在 FROM `table_name` 中使用 "||table_name||"
而不仅仅是 table_name
【参考方案1】:
请解释如何以及何时添加我认为放错地方的引号
你在几个地方有下面
FROM `table_name`
只需用下面的替换
FROM `"||table_name||"`
【讨论】:
以上是关于通过将列和表名作为参数传递来创建 BigQuery 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
通过将表名作为参数传递,使用 oracle 中的存储过程从表中搜索数据