ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

sql-Google BQ:运行参数化查询,其中参数变量是BQ表目标

2019-10-25 12:50:30  阅读:324  来源: 互联网

标签:google-bigquery command-line parameters linux sql


我正在尝试从Linux命令行为BQ Table目标运行SQL.该SQL脚本将用于多个日期,客户端和BQ表目的地,因此这将需要在BQ API命令行调用中使用参数(标志–parameter).现在,我已经通过以下链接来学习有关参数化查询的信息:https://cloud.google.com/bigquery/docs/parameterized-queries,但是它在帮助我声明表名方面受到限制.

我的SQL脚本称为Advertiser_Date_Check.sql,如下所示:

#standardSQL
SELECT *
FROM (SELECT *
      FROM @variable_table
      WHERE CAST(_PARTITIONTIME AS DATE) = @variable_date) as final
WHERE final.Advertiser IN UNNEST(@variable_clients)

其中参数变量表示以下内容:

> variable_table:我要调用的BQ Table目标
> variable_date:我要从BQ表中提取的日期
> variable_clients:我要从数据中拉出的特定客户端的数组列表(从我引用的日期开始)

现在,我的BQ数据的命令行(LINUX)如下

TABLE_NAME=table_name_example
BQ_TABLE=$(echo '`project_id.dataset_id.'$TABLE_NAME'`')
TODAY=$(date +%F)

/bin/bq query --use_legacy_sql=false    \
       --parameter='variable_table::'$BQ_TABLE''  \
       --parameter=variable_date::"$TODAY"    \
       --parameter='variable_clients:ARRAY<STRING>:["Client_1","Client_2","Client_3"]'  \
       "`cat /path/to/script/Advertiser_Date_Check.sql`" 

@variable_date和@variable_clients的参数在过去仅仅是它们时就可以正常工作.但是,由于我希望在循环中的各个表上运行此确切的SQL命令,因此我创建了一个名为variable_table的参数.参数化查询必须采用标准SQL格式,因此表名称约定必须采用以下格式:

`project_id.dataset_id.table_name`

每当我尝试在命令行上运行此命令时,通常会出现以下错误:

Error in query string: Error processing job ... : Syntax error: Unexpected "@" at [4:12]

它引用了参数@variable_table,因此很难处理它正在引用表名的情况.
在过去的尝试中,甚至出现了错误:

project_id.dataset_id.table_name: command not found

但这主要是由于对表目标名称的引用不佳.第一个错误是最常见的情况.

总体而言,我对此事的疑问是:

>如何在FROM子句中的参数化查询的命令行中将BQ表作为参数引用(例如,我尝试使用@variable_table进行操作)?可能吗?
>除了我目前正在使用的方式之外,您是否知道其他方法可从命令行对多个BQ表运行查询?

希望这一切有意义,并感谢您的协助!

解决方法:

从您链接的文档中:

Parameters cannot be used as substitutes for identifiers, column names, table names, or other parts of the query.

我认为,在这种情况下,对您有用的是将表名作为常规shell变量(而不是查询参数)进行注入.您需要确保您信任它的内容,或者您​​自己在构建字符串,以避免SQL注入.一种方法是对表名使用硬编码的常量,然后根据用户输入选择要插入查询文本的常量.

标签:google-bigquery,command-line,parameters,linux,sql
来源: https://codeday.me/bug/20191025/1928849.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有