使用 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 中使用动态 where 子句
如何只使用一次 EXECUTE IMMEDIATE 创建 2 个表?