我正在尝试从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)
其中参数变量表示以下内容:
现在,我的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
但这主要是由于对表目标名称的引用不佳。第一个错误是最常见的情况。
总体而言,我对此事的疑问是:
希望这一切有意义,并感谢您的协助!
最佳答案
从您链接的文档中:
我认为,在这种情况下,对您有用的是将表名作为常规shell变量(而不是查询参数)进行注入(inject)。您需要确保您信任它的内容,或者您自己在构建字符串,以避免SQL注入(inject)。一种方法是对表名使用硬编码的常量,然后根据用户输入选择要插入查询文本的常量。
关于sql - Google BQ : Running Parameterized Queries where Parameter Variable is the BQ Table Destination,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47998766/