snow sql

Snowflake クエリを実行します。クエリ、ファイル名、インプットオプションのいずれかを使用します。実行するクエリは、クエリオプション、ファイル名オプション(ファイルからのすべてのクエリが実行されます)、または他のコマンドからの出力をパイプしてstdin経由で指定できます。例: cat my.sql | snow sql -i。このコマンドは、クライアント側で行われる変数の置換をサポートします。

構文

snow sql
  --query <query>
  --filename <files>
  --stdin
  --variable <data_override>
  --retain-comments
  --single-transaction / --no-single-transaction
  --project <project_definition>
  --env <env_overrides>
  --connection <connection>
  --host <host>
  --port <port>
  --account <account>
  --user <user>
  --password <password>
  --authenticator <authenticator>
  --private-key-file <private_key_file>
  --token-file-path <token_file_path>
  --database <database>
  --schema <schema>
  --role <role>
  --warehouse <warehouse>
  --temporary-connection
  --mfa-passcode <mfa_passcode>
  --enable-diag
  --diag-log-path <diag_log_path>
  --diag-allowlist-path <diag_allowlist_path>
  --oauth-client-id <oauth_client_id>
  --oauth-client-secret <oauth_client_secret>
  --oauth-authorization-url <oauth_authorization_url>
  --oauth-token-request-url <oauth_token_request_url>
  --oauth-redirect-uri <oauth_redirect_uri>
  --oauth-scope <oauth_scope>
  --oauth-disable-pkce
  --oauth-enable-refresh-tokens
  --oauth-enable-single-use-refresh-tokens
  --client-store-temporary-credential
  --format <format>
  --verbose
  --debug
  --silent
  --enhanced-exit-codes
Copy

引数

なし

オプション

--query, -q TEXT

実行するクエリ。

--filename, -f FILE

実行するファイル。デフォルト: []

--stdin, -i

標準入力からクエリを読み取ります。このコマンドに入力をパイプするときに使用します。デフォルト: false。

--variable, -D TEXT

key=value形式の文字列。提供された場合、 SQL コンテンツはテンプレートとして扱われ、提供されたデータを使用してレンダリングされます。

--retain-comments

Snowflakeに渡されたクエリのコメントを保持します。デフォルト: false。

--single-transaction / --no-single-transaction

自動コミットを無効にして接続します。ステートメントを BEGIN/COMMIT で囲んで単一のトランザクションとして実行し、すべてのコマンドを正常に完了するか、変更が適用されないようにします。デフォルト: false。

-p, --project TEXT

Snowflakeプロジェクトが保存されているパス。デフォルトは現在の作業ディレクトリです。

--env TEXT

key=value の形式の文字列。テンプレートに使用されたenvセクションの変数を上書きします。デフォルト: []

--connection, -c, --environment TEXT

config.toml ファイルで定義されている接続の名前。デフォルト: デフォルト

--host TEXT

接続用のホストアドレス。接続に指定された値を上書きします。

--port INTEGER

接続のポート。接続に指定された値を上書きします。

--account, --accountname TEXT

Snowflakeアカウントに割り当てられた名前。接続に指定された値を上書きします。

--user, --username TEXT

Snowflakeに接続するユーザー名。接続に指定された値を上書きします。

--password TEXT

Snowflakeのパスワード。接続に指定された値を上書きします。

--authenticator TEXT

Snowflakeの認証コード。接続に指定された値を上書きします。

--private-key-file, --private-key-path TEXT

Snowflake プライベートキーファイルへのパス。接続に指定された値を上書きします。

--token-file-path TEXT

Snowflake接続時に使用する OAuth トークンを含むファイルへのパス。

--database, --dbname TEXT

使用するデータベース。接続に指定された値を上書きします。

--schema, --schemaname TEXT

使用するデータベーススキーマ。接続に指定された値を上書きします。

--role, --rolename TEXT

使用するロール。接続に指定された値を上書きします。

--warehouse TEXT

使用するウェアハウス名。接続に指定された値を上書きします。

--temporary-connection, -x

config で定義された接続ではなく、コマンドラインパラメーターで定義された接続を使用します。デフォルト: false。

--mfa-passcode TEXT

多要素認証(MFA)に使用するトークン。

--enable-diag

接続診断レポートを作成するかどうか。デフォルト: false。

--diag-log-path TEXT

生成されたレポートのパス。デフォルトはシステム仮ディレクトリです。デフォルト: <system_temporary_directory>.

--diag-allowlist-path TEXT

allowlist パラメーターを含む JSON ファイルへのパス。

--oauth-client-id TEXT

Snowflake統合のためにIDプロバイダーが提供するクライアントIDの値。

--oauth-client-secret TEXT

Snowflake 統合用に ID プロバイダーが提供するクライアントシークレットの値。

--oauth-authorization-url TEXT

認証コードをドライバーに提供する ID プロバイダーエンドポイント。

--oauth-token-request-url TEXT

ドライバーにアクセストークンを供給する ID プロバイダーのエンドポイント。

--oauth-redirect-uri TEXT

URI 認証コードのリダイレクトに使用します。

--oauth-scope TEXT

ID プロバイダー承認リクエストで要求された範囲。

--oauth-disable-pkce

コード交換の証明キー (PKCE) を無効にします。デフォルト: False

--oauth-enable-refresh-tokens

実際のアクセストークンが古くなった場合に、サイレント再認証コードを有効にします。デフォルト: False

--oauth-enable-single-use-refresh-tokens

シングルユース・更新・トークンのセマンティクスにオプトインするかどうか。デフォルト: False

--client-store-temporary-credential

仮認証情報を保存します。

--format [TABLE|JSON]

出力形式を指定します。デフォルト: TABLE

--verbose, -v

ログレベル info 以上のログエントリを表示します。デフォルト: false。

--debug

ログレベル debug 以上のログ エントリを表示します。デバッグログには追加情報が含まれます。デフォルト: false。

--silent

コンソールへの中間出力をオフにします。デフォルト: false。

--enhanced-exit-codes

終了エラーコードをエラーのタイプによって区別します。デフォルト: false。

--help

このコマンドのヘルプテキストを表示します。

使用上の注意

実行する SQL クエリを、次のオプションのいずれかを使用して指定できます。

  • --query オプションを使用してクエリ文字列を指定します。

  • SQL クエリを含む1つ以上のファイルを実行するには、 --filename オプションを使用します。例:

    • snow sql -f myfile.sql

    • snow sql -f file1.sql -f file2.sql

  • クエリを stdin として指定し、 snow sql コマンドにパイプします。例えば cat my.sql | snow sql です。

  • SYSTEM 関数 のドル記号など、クエリにシェルに解釈させたくない特殊文字が含まれている場合は、次のいずれかを実行できます。

    • 次のように、クエリを二重引用符ではなく一重引用符で囲みます。

      snow sql -q 'SELECT SYSTEM$CLIENT_VERSION_INFO()'

    • 次のように特殊文字をエスケープします。

      snow sql -q "SELECT SYSTEM\$CLIENT_VERSION_INFO()"

  • SQL クエリをテンプレート化するために、 SQL クエリの <% variable_name %> プレースホルダーと -D コマンドラインオプションを組み合わせた変数を次の形式で使用します。

    snow sql -q "select * from my-database order by <% column_name %>" -D "column_name=Country"
    
    Copy

    注釈

    現在、テンプレートには SnowSQL &variable_name<% variable_name %> の構文を使うことができます。ただし、Snowflakeでは <% variable_name %> 構文の使用を推奨しています。

  • クエリでスクリプトブロックを指定します。例:

    EXECUTE IMMEDIATE $$
    -- Snowflake Scripting code
    DECLARE
      radius_of_circle FLOAT;
      area_of_circle FLOAT;
    BEGIN
      radius_of_circle := 3;
      area_of_circle := pi() * radius_of_circle * radius_of_circle;
      RETURN area_of_circle;
    END;
    $$
    ;
    
    Copy

    注釈

    スクリプトブロックを Snowflake CLI コマンドラインで直接指定する場合、シェルによっては $$ という区切り文字が別のものとして解釈されるため、動作しないことがあります。たとえば、bashシェルやzshシェルは、これをプロセス ID (PID)として解釈します。この制限に対処するために、次のような選択肢を使うことができます。

    • それでもコマンドラインでスクリプトブロックを指定する場合は、 $$ 区切り文字をエスケープして、 \$\$ のようにすることができます。

    • デフォルトの $$ 区切り文字のスクリプトブロックを別のファイルに置き、 snow sql -f <filename> コマンドで呼び出すこともできます。

エラーコードの強化

--enhanced-exit-codes オプションは、クエリの実行結果による問題か、無効なコマンド・オプションによる問題かを識別するのに役立つ情報を提供します。このオプションを指定すると、 snow sql コマンドは以下のリターンコードを提供します。

  • 0: 実行成功

  • 2: コマンドパラメーターの問題

  • 5: クエリ実行の問題

  • 1: その他のタイプ

コマンド実行後、 echo $? シェルコマンドでリターンコードを確認できます。

この例では、コマンドはクエリパラメーター(-q 'select 1')とクエリファイルパラメーター(-f my.query)の両方を含んでおり、これは無効なパラメーターの組み合わせです。

snow sql --enhanced-exit-codes -q 'select 1' -f my.query

echo $?
Copy
2

次の例は、コマンドに無効なクエリ(slectのスペルが間違っている)が含まれている場合の --enhanced-exit-codes オプションの効果を示しています。

  • --enhanced-exit-codes オプションを付けると、コマンドはクエリエラーを示す 5 終了コードを返します。

    snow sql --enhanced-exit-codes -q 'slect 1'
    
    echo $?
    
    Copy
    5
    
  • --enhanced-exit-codes オプションを指定しないと、コマンドは一般的な(その他の)エラーを示す 1 終了コードを返します。

    snow sql --enhanced-exit-codes -q 'slect 1'
    
    echo $?
    
    Copy
    1
    

あるいは、 SNOWFLAKE_ENHANCED_EXIT_CODES 環境変数を 1 に設定して、すべての snow sql コマンドの拡張リターンコードを送信することもできます。

インタラクティブモード

snow sql コマンドは、 SQL コマンドを一度に入力できるインタラクティブモードをサポートしています。インタラクティブモードには以下の機能があります。

  • 構文の強調表示

    インタラクティブモードの構文の強調表示
  • タイプ中のコード補完

    インタラクティブモードのコード補完
  • 検索可能な履歴

    コマンド履歴を検索するには、CTRL-R を押します。

    インタラクティブモードの検索可能な履歴
  • マルチライン入力

    セミコロンで終わっていない行(;)で ENTER を押すと、ステートメントがセミコロンで終わるまで、カーソルは次の行に移動してコマンドを続けます。

    インタラクティブモードのマルチライン入力

インタラクティブモードを使用するには、以下のように、 snow sql コマンドに続いて、 ENTER を入力します。

snow sql
Copy

このコマンドは、 > プロンプトのあるサブシェルを開き、 SQL コマンドを対話的に入力できます。

$ snow sql
  ╭───────────────────────────────────────────────────────────────────────────────────╮
  │ Welcome to Snowflake-CLI REPL                                                   │
  │ Type 'exit' or 'quit' to leave                                                  │
  ╰───────────────────────────────────────────────────────────────────────────────────╯
  >

以下のように、 SQL コマンドを入力します。

> create table my_table (c1 int);
Copy
+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MY_TABLE successfully created.|
+-------------------------------------+

注釈

各 SQL ステートメントをセミコロン(;)で終わらせる必要があります。

インタラクティブモードを終了するには、 exitquit、または CTRL-D と入力します。

1トランザクションで複数のコマンドを実行可能

--single-transaction オプションを使用すると、複数の SQL コマンドを入力し、オールオアナッシングのコマンドセットとして実行することができます。コマンドを単一のトランザクションで実行することで、変更をコミットする前にすべてのコマンドが正常に完了することを確認できます。コマンドのどれかが失敗した場合、成功したコマンドからの変更はどれも持続しません。

以下の例は、成功したトランザクションと失敗したトランザクションを示しています。

  • コマンド実行成功

    snow sql -q "insert into my_tbl values (123); insert into my_tbl values (124);" --single-transaction
    
    Copy
    BEGIN;
    +----------------------------------+
    | status                           |
    |----------------------------------|
    | Statement executed successfully. |
    +----------------------------------+
    
    insert into my_tbl values (123);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    insert into my_tbl values (124);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    COMMIT
    +----------------------------------+
    | status                           |
    |----------------------------------|
    | Statement executed successfully. |
    +----------------------------------+
    

    その後、コマンドがデータベースにコミットされたことを確認できます。

    snow sql -q "select count(*) from my_tbl"
    
    Copy
    select count(*) from my_tbl
    +----------+
    | COUNT(*) |
    |----------|
    | 2        |
    +----------+
    
  • 単一トランザクションの失敗

    snow sql -q "insert into my_tbl values (123); insert into my_tbl values (124); select BAD;" --single-transaction
    
    Copy
    BEGIN;
    +----------------------------------+
    | status                           |
    |----------------------------------|
    | Statement executed successfully. |
    +----------------------------------+
    
    insert into my_tbl values (123);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    insert into my_tbl values (124);
    +-------------------------+
    | number of rows inserted |
    |-------------------------|
    | 1                       |
    +-------------------------+
    
    select BAD;
    ╭─ Error ───────────────────────────────────────────────────────────────────────────────╮
    │ 000904 (42000): 01bc3b84-0810-0247-0001-c1be14ee11ce: SQL compilation error: error    │
    │ line 1 at position 7                                                                  │
    │ invalid identifier 'BAD'                                                              │
    ╰───────────────────────────────────────────────────────────────────────────────────────╯
    

その後、コマンドがデータベースにコミットされていないことを確認できます。

snow sql -q "select count(*) from my_tbl"
Copy
select count(*) from my_tbl
+----------+
| COUNT(*) |
|----------|
| 0        |
+----------+

  • 以下の例では、 SQL SYSTEM$CLIENT_VERSION_INFO システム関数を使用して、クライアントとドライバーのバージョン情報を返します。

    snow sql --query 'SELECT SYSTEM$CLIENT_VERSION_INFO();'
    
    Copy
    select current_version();
    +-------------------+
    | CURRENT_VERSION() |
    |-------------------|
    | 8.25.1            |
    +-------------------+
    
  • 次の例は、クライアント側の変数を使用してデータベースを指定する方法を示しています。

    snow sql -q "select * from <% database %>.logs" -D "database=dev"
    
    Copy

    実行されると、コマンドは <% database %> 変数の値を dev に置き換えて dev.logs 識別子を作成し、 select * from dev.logs SQL クエリをSnowflakeに送信して処理します。

    注釈

    現在、テンプレートには SnowSQL &variable_name 構文を使用できます。ただし、Snowflakeでは <% variable_name %> 構文の使用を推奨しています。

  • この例では、 --env オプションを使って環境変数を渡す方法を示しています。

    snow sql -q "select '<% ctx.env.test %>'" --env test=value_from_cli
    
    Copy
  • デフォルトでは、 Snowflake CLI は SQL クエリのコメントを出力から削除します。以下の例では、クエリ結果にコメントを含めるために --retain-comments オプションを使用しています。

    example.sql ファイルに以下のステートメントとコメントが含まれていると仮定します。

    select 'column1';
    -- My comment
    select 'column2';
    
    Copy

    以下のコマンドを実行すると、クエリ結果に --My comment が表示されます。

    snow sql -f example.sql --retain-comments
    
    Copy
    select 'column1';
    +-----------+
    | 'COLUMN1' |
    |-----------|
    | ABC       |
    +-----------+
    
    -- My comment
    select 'bar';
    +-----------+
    | 'COLUMN2' |
    |-----------|
    | 123       |
    +-----------+
    
    Copy