使用 EXECUTE IMMEDIATE 保存带有动态 SQL 的 BigQuery 视图

Posted

技术标签:

【中文标题】使用 EXECUTE IMMEDIATE 保存带有动态 SQL 的 BigQuery 视图【英文标题】:Saving a BigQuery view with dynamic SQL using EXECUTE IMMEDIATE 【发布时间】:2020-10-09 02:37:01 【问题描述】:

我在 BigQuery 上使用 EXECUTE IMMEDIATE 创建了一个 SQL 查询,以便计算我的数据集中所有表的行数。

我需要将此保存为视图,以便在另一个查询中使用它进行报告。但是,BigQuery 不允许将我的查询保存为视图。

declare query string default (
    select string_agg(
                   array_to_string(
                           ["SELECT '",
                               table_name,
                                   "' as table_name, " ||
                                   "count(*) as row_count from my_data_set.",
                               table_name, ' union all'],
                       ''),
                   ' ')

    from my_data_set.INFORMATION_SCHEMA.TABLES
);

EXECUTE IMMEDIATE substr(query, 1, length(query) - length(' union all'))

将此保存为视图将返回 Only SELECT statements are allowed in view queries 错误。

那么这里的工作是什么?我如何保存这个(或它的等价物)以供以后查看?

【问题讨论】:

我看到的唯一解决方法是将功能请求提交给 BigQuery 团队 - issuetracker.google.com/issues/… 以使脚本在视图中工作 好主意@MikhailBerlyant 我会这样做的。 【参考方案1】:

你可以试试这个:

declare dsql string;
declare query string default (
    select string_agg(
                   array_to_string(
                           ["SELECT '",
                               table_name,
                                   "' as table_name, " ||
                                   "count(*) as row_count from my_data_set.",
                               table_name, ' union all'],
                       ''),
                   ' ')

    from my_data_set.INFORMATION_SCHEMA.TABLES
);

set dsql = 'create or replace view my_data_set.my_view as ' || substr(query, 1, length(query) - length(' union all'));

EXECUTE IMMEDIATE dsql;

【讨论】:

我希望您期待这个解决方案。如果没有,请告诉我,以便我删除此帖子! 嗨,谢谢。虽然恐怕这并不能回答问题。 我在这里有点困惑。根据问题BigQuery view with dynamic SQL using EXECUTE IMMEDIATE,我相信答案是合适的。是的,您可以根据接受的答案更改您的问题☹ 问题是 BigQuery 不允许保存包含 EXECUTE IMMEDIATE 的视图,您仍然在建议的解决方案中使用该视图。我现在知道您做了一个应该作为脚本运行的查询,而该脚本又会代表我编写视图。我最初不明白这一点,并试图将其保存为视图。现在我知道它是如何工作的,我会试一试并回复您。 @Benjamin;谢谢你。老实说,你做了所有的努力,而我做了一个很小的部分!【参考方案2】:

对于这个特定的报告,您可以使用另一个 INFORMATION_SCHEMA 表:

select table_id,row_count from `project-id.dataset_id.__TABLES__`

已经计算过了

到目前为止,据我所知,您无法使用execute immediate 创建视图

抱歉最后一句需要更正

【讨论】:

:O 捷径!我怎么没有在文档中找到这个?非常感谢。

以上是关于使用 EXECUTE IMMEDIATE 保存带有动态 SQL 的 BigQuery 视图的主要内容,如果未能解决你的问题,请参考以下文章

EXECUTE IMMEDIATE 插入多行列

如何在 EXECUTE IMMEDIATE 中使用动态 where 子句

varchar in execute immediate

如何只使用一次 EXECUTE IMMEDIATE 创建 2 个表?

在存储过程中对 DML 语句使用 EXECUTE IMMEDIATE

在 Oracle 中使用 Execute Immediate 将数据插入表中