C.T*_*sen 3 sql linux parameters command-line google-bigquery
我正在尝试从 Linux 命令行为 BQ 表目标运行 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)
Run Code Online (Sandbox Code Playgroud)
其中参数变量表示如下:
现在,我的 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`"
Run Code Online (Sandbox Code Playgroud)
@variable_date 和 @variable_clients 的参数在过去只是它们时工作得很好。但是,由于我希望在循环中的各种表上运行这个精确的 SQL 命令,因此我创建了一个名为 variable_table 的参数。参数化查询必须采用标准 SQL 格式,因此表名约定需要采用以下格式:
`project_id.dataset_id.table_name`
Run Code Online (Sandbox Code Playgroud)
每当我尝试在命令行上运行它时,我通常会收到以下错误:
Error in query string: Error processing job ... : Syntax error: Unexpected "@" at [4:12]
Run Code Online (Sandbox Code Playgroud)
这是引用参数@variable_table,因此很难处理这是引用表名。在过去的尝试中,甚至出现了错误:
project_id.dataset_id.table_name: command not found
Run Code Online (Sandbox Code Playgroud)
但这主要是由于表目标名称引用不当。第一个错误是最常见的。
总的来说,我对此事的问题是:
希望这一切都有意义,并感谢您的帮助!
从您链接的文档中:
参数不能用作标识符、列名、表名或查询的其他部分的替代品。
不过,我认为在这种情况下可能对您有用的是将表名作为常规 shell 变量(而不是查询参数)进行注入。您需要确保您信任其中的内容,或者您自己构建字符串以避免 SQL 注入。一种方法是为表名设置硬编码常量,然后根据用户输入选择要插入到查询文本中的常量。
| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |