动态更改 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` " )
我正在使用标准的 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 中看到了一个
尝试 #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` " )