动态更改 SQL 查询中使用的项目

Dynamically change project used in a SQL query

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

例如:

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

总是会因为不能在 FROM 子句中使用参数而出错。但是,我在 BigQuery 中看到了一个 on using dynamic SQL to overcome this obstacle. I've been looking into the EXECUTE IMMEDIATE 函数,因为这就是被引用的解决方案。从那个 post 我尝试以几种方式实现:

尝试 #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] 处未声明的查询参数”

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

只需删除 @:

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