2017-12-27 77 views
1

BQテーブルの宛先のLinuxコマンドラインからSQLを実行しようとしています。このSQLスクリプトは、複数の日付、クライアント、BQテーブルの宛先に使用されるため、BQ APIのコマンドライン呼び出し(flag --parameter)でパラメータを使用する必要があります。今、私はパラメータ化されたクエリについて学ぶためにこのリンクをたどってきました:https://cloud.google.com/bigquery/docs/parameterized-queriesしかし、それはテーブル名を宣言するのに役立ちます。Google BQ:パラメータ化されたクエリを実行するパラメータ変数がBQテーブルのデスティネーションである場合

Advertiser_Date_Check.sqlと呼ばれる私の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表先
  • 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のパラメータである

  • (私は参照日からである)データから

を引っ張るNTそれがちょうど彼らだったときに過去にうまくいった。しかし、この正確な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 

しかし、これは主に、テーブルの宛先名の貧しい参照によるものでした。最初のエラーが最も一般的な発生です。

全体的に、この問題についての私の質問は以下のとおりです。

  1. 私は、そのような私が@variable_tableをどうしようとするものとして、FROM句でのパラメータ化クエリのためのコマンドラインでのパラメータ(としてBQ表を参照するにはどうすればよいです)?それも可能ですか?
  2. 私が現在行っている方法以外に、コマンドラインから複数のBQテーブルに対してクエリを実行する他の方法について知っていますか?

このすべてが意味をなさないと願っています。リンクされたドキュメントから

+0

リンクしたドキュメントから、「識別子は、識別子、列名、テーブル名、またはクエリの他の部分の代用として使用できません。」 –

+0

Oh geez。私はちょうどその部分を見逃しているに違いない。それはかなり長い一日だった。返信いただきありがとうございます。 –

+2

私はあなたのために働くかもしれないが、(クエリパラメータの代わりに)通常のシェル変数としてテーブル名の注入を実行していると思います。あなたは、SQLインジェクションを避けるために、あなたがその内容を信頼しているか、あなた自身が文字列を構築していることを確認したいでしょう。 –

答えて

2

:私はこのケースではあなたのために働くかもしれないものだと思う

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

は、しかし、通常のシェル変数(の代わりに、クエリパラメータとしてテーブル名の注入を行っています)。あなたは、SQLインジェクションを避けるために、あなたがその内容を信頼しているか、あなた自身が文字列を構築していることを確認したいでしょう。 1つのアプローチは、テーブル名にハードコーディングされた定数を持たせ、次にユーザー入力に基づいてクエリテキストに挿入する定数を選択することです。

関連する問題