BigQuery 存储过程,用于捕获表名以及该表名的记录数

Posted

技术标签:

【中文标题】BigQuery 存储过程,用于捕获表名以及该表名的记录数【英文标题】:BigQuery stored procedure to capture table name along with number of records for that table name 【发布时间】:2020-11-03 18:32:43 【问题描述】:

我在 BigQuery 中创建了以下存储过程,以获取表名列表以及每个表名的计数。我遇到了 2 个我无法解决的问题。

#1 - 如何在我的“立即执行”Sql 语句中为每个表执行计数?

#2 - 我的数组结果“tbl_lst_array”包含超过 800 个表,但存储过程(执行时)只返回 100 行。是因为 Google 强加了以下配额吗? https://cloud.google.com/bigquery/quotas

我通过循环一次处理一张表。

感谢您的帮助。


create procedure SP_MERGE.SP_bq_table_counts()

BEGIN
   DECLARE tbl_lst_array ARRAY<STRING>;
   DECLARE i INT64 DEFAULT 1;
   CREATE TEMP TABLE tbl_results(field STRING);  
   
   SET tbl_lst_array = (SELECT ARRAY_AGG(table_schema||'.'||table_name) FROM `tng-edw-data-dev`.EDW.INFORMATION_SCHEMA.TABLES);   
   
   WHILE (i < ARRAY_LENGTH(tbl_lst_array)) DO
   
      EXECUTE IMMEDIATE '''
        INSERT tbl_results
            SELECT "''' || tbl_lst_array[ORDINAL(i)] || '''"
        ''';
     
        # Increment counter
        SET i = i + 1;
     
   END WHILE;   

   select * from tbl_results;
   
END;

【问题讨论】:

【参考方案1】:

你的观点是正确的。不要为每次迭代执行 1 个插入作业,而是确保您收集/连接它们并在循环结束时执行 1 个包含所有行的单个插入作业。这样可以避免并发作业限制。

【讨论】:

以上是关于BigQuery 存储过程,用于捕获表名以及该表名的记录数的主要内容,如果未能解决你的问题,请参考以下文章

用于获取表名、视图和存储过程的 SQL 语句,按模式排序

SQL Server:使用动态表名插入存储过程

表名上的特殊字符 Bigquery

BigQuery:按表名分组

如何根据列名查找表名,然后访问该表

mysql 存储过程 动态表名