通过将列和表名作为参数传递来创建 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_namedataset_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 中的存储过程从表中搜索数据

存储过程,将表名作为参数传递

如何将表名作为参数传递给存储过程?

如何通过 PL/SQL 过程和表名作为变量打印动态 SQL 中的所有表行?

将列动态添加到现有 BigQuery 表

数组名作为参数转为指针