dynamic - 动态更改 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 子句时它似乎仍然不起作用。非常感谢任何帮助,愿意尝试任何被抛出的东西 - 很高兴了解可以做什么!
解决方案
只需删除@
:
DECLARE ProjectId STRING DEFAULT 'test_project';
EXECUTE IMMEDIATE CONCAT(
"SELECT * FROM ", ProjectId, ".DataSet.`Table` " )
推荐阅读
- unity3d - Unity - 为角色控制器脚本 2D 的“什么是地面”字段中不存在的平台新创建的层
- python - 从 read_html 源写入 csv 文件
- python - 在 Jupyer 笔记本中绘图后如何抑制文本输出
- php - 是否可以将 wordpress 网站与普通网站合并或整合?
- c++ - 我如何绕过不允许模板化的虚拟功能
- html - 在 Bootstrap 表单中正确对齐相邻按钮
- webserver - 如何将 Windows 10 PC 变成 Web 服务器
- scala - 计算值 > 2 的记录的百分比
- mysqlbinlog - lsyncd 无法更新 mysql-bin.00001
- mysql - 问题 Django V 1.11.16 管理员搜索无法处理所有数据