首页 > 解决方案 > 动态更改 SQL 查询中使用的项目

问题描述

我正在使用 BigQuery、标准 SQL,并且我想动态更改 FROM 子句的某些部分,例如项目 ID。在过去的 3 年里,我一直在寻找解决方案 - 问题是参数不能用作 FROM 子句中的输入。这样做的好处是创建一个存储过程,其中项目 id 可以作为参数传入并可以查询适当的项目。这些项目将具有相同的数据集和表名——这将是我们构建主查询以便于开发和实施的方式。无需更改 15 个客户端的视图,我们可以更改存储过程一次,它会将更改推送到所有客户端的视图。但是,我一直对动态更改 FROM 子句很感兴趣!

例如:

DECLARE ProjectId STRING DEFAULT 'test_project';
SELECT col_1 FROM `@ProjectId.Dataset.Table`;

由于无法在 FROM 子句中使用参数,总是会出错。但是,我看到了一篇关于使用动态 SQL 克服这个障碍的相关帖子。我一直在研究 BigQuery 中的EXECUTE IMMEDIATE函数,因为这被认为是一种解决方案。从那篇文章中,我尝试以多种方式实现:

尝试#1:

DECLARE ProjectId STRING DEFAULT 'test_project';
EXECUTE IMMEDIATE CONCAT(
      "SELECT * FROM ", @ProjectId, ".DataSet.`Table` " )

^ 这给出了一个错误“查询错误:未声明的查询参数在 [2:19]”

尝试#2:

EXECUTE IMMEDIATE CONCAT(
      "SELECT * FROM ", @ProjectId, ".DataSet.`Table` " )
      USING 'my-project' as ProjectId, 'my-dataset' as DataSet;

^ 给出错误“查询错误:[1:19] 处未声明的查询参数”

第三次也是最后一次尝试是尝试在 EXECUTE IMMEDIATE 中声明参数:

EXECUTE IMMEDIATE CONCAT(
      "DECLARE ProjectId STRING DEFAULT 'test_project'; ",
      "SELECT * FROM ", @ProjectId, ".DataSet.`Table` " )
      USING 'my-project' as ProjectId, 'my-dataset' as DataSet; 

^ 您猜对了,它会导致相同的错误“查询错误:未声明的查询参数在 [1:19]”

我正在伸出手来看看是否有人在这方面取得了成功?我在动态 SQL 语句中看到了值,并阅读了文档和一些示例,但是在尝试动态更改 FROM 子句时它似乎仍然不起作用。非常感谢任何帮助,愿意尝试任何被抛出的东西 - 很高兴了解可以做什么!

标签: dynamicgoogle-bigquery

解决方案


只需删除@

DECLARE ProjectId STRING DEFAULT 'test_project';
EXECUTE IMMEDIATE CONCAT(
      "SELECT * FROM ", ProjectId, ".DataSet.`Table` " )

推荐阅读