SQL ステートメントの実行

The snow sql command lets you execute ad-hoc SQL queries or files containing SQL queries using the following options:

  • To execute an ad-hoc query, use the -q command-line option. For example, to execute a simple SQL SELECT query, as shown in the following example:

    snow sql -q "SELECT * FROM FOO;"
    
    Copy
  • To execute a file containing a SQL query, use the -f command-line option to specify the path to the file. For example, to execute a file containing a SQL query, as shown in the following example:

    snow sql -f my_query.sql
    
    Copy

The snow sql command also can execute multiple statements; in that case, multiple result sets are returned. For example running:

snow sql  -q "select 'a', 'b'; select 'c', 'd';"
Copy

出力は次のようになります。

select 'a', 'b';
+-----------+
| 'A' | 'B' |
|-----+-----|
| a   | b   |
+-----------+

select 'c', 'd';
+-----------+
| 'C' | 'D' |
|-----+-----|
| c   | d   |
+-----------+

また、 スクリプトブロック を、 Snowflake CLI の中で実行することもできます。この場合、 $$ 区切り文字に関する注意事項があります。

例:

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

オペレーティングシステムによっては、スクリプトブロックの区切り文字として認識せず、プロセス ID (PID)のように $$ を解釈するものもあります。この制限に対処するために、次のような選択肢を使うことができます。

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

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

詳細については、 snow sql コマンドをご参照ください。

SQL テンプレートの変数の使用

状況によっては、コンテキストに応じて SQL クエリを変更する必要がある場合があります。snow sql コマンドはクライアント側の変数置換をサポートしており、クエリを送信する前にローカルで解決されるコマンド内の変数を使用できます。 SQL 文字列内の変数は <% 変数名 %> の形式をとり、 -D (または --variable)オプションで変数の値を指定します。

注釈

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

たとえば、クライアント側の変数を使用してデータベースを指定するには、次のようなコマンドを入力します。

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

実行されると、コマンドは <% データベース %> 変数の値を dev に置き換えて dev.logs ファイル名を作成し、 select * from dev.logs SQL クエリをSnowflakeに送信して処理します。

次に示すように、複数の変数入力を指定することもできます。

snow sql \
-q "grant usage on database <% database %> to <% role %>" \
-D "database=dev" \
-D "role=eng_rl"
Copy

この例では、次の SQL クエリが生成されます。

grant usage on database dev to eng_rl
Copy

--enable-templating オプションを使用すると、どのテンプレート化構文で SQL クエリを解決するかを指定できます。Snowflake CLI は、次の構文をサポートしています。

  • STANDARD:標準の Snowflake CLI 変数構文(<% variable_name %>)をサポートします。デフォルトで有効。

  • LEGACY:SnowSQL 変数構文(&{ variable_name } または:codenowrap:&variable_name)をサポートします。デフォルトで有効。

  • JINJA:jinja変数構文({{ variable_name}})をサポートします。デフォルトで無効。

  • ALL:サポートされているすべての構文を許可します。デフォルトで無効。

  • NONE:テンプレート化はサポートされていません。デフォルトで無効。

次の例では、テンプレート化をサポートするさまざまな方法を説明します。

  • テンプレート化を無効にし、いずれのクエリ変数も解決されないようにします。

    snow sql --enable-templating NONE -q "select '<% not_resolved %> &not_resolved'"
    
    Copy
  • LEGACY テンプレート化を許可せずに、JINJA および STANDARD テンプレート化を許可します。

    snow sql --enable-templating JINJA --enable-templating STANDARD -q "select '<% resolved %> {{ resolved }} &not_resolved'"
    
    Copy
  • すべての構文を有効にすると、SQL クエリは3つの構文すべてを解決します。

    snow sql --enable-templating ALL -q "select '<% resolved %> {{ resolved }}'"
    snow sql --enable-templating ALL -q "select '&resolved {{ resolved }}'"
    
    Copy

注釈

JINJA 変数が有効な場合は、STANDARD および LEGACY 変数の後に解決されます。

snowflake.yml プロジェクト定義ファイルに変数を保存する

snow sql コマンドラインオプションとして変数を指定することが必ずしも実用的ではなく、またコマンドラインで機密性の高い値を指定したくない場合もあります。このような場合は、 snowflake.yml プロジェクト定義ファイルで変数と値を定義できます。その場合、 -D "<変数> = <値>" オプションを使用する代わりに、 <% ctx.env.<変数名> %> の形式で変数名を指定します。

前のセクションの例を使用して、データベースとロールの変数を snowflake.yml ファイルに保存し、クエリを次のように変更できます。

snow sql -q "grant usage on database <% ctx.env.database %> to <% ctx.env.role %>"
Copy

この例では、 snow sql コマンドはプロジェクト定義ファイル内の変数定義を検索し、コマンドラインに表示させずに値を抽出します。snowflake.yml ファイルは、現在の作業ディレクトリか、 :codenowrap: -p オプションで指定された場所のいずれかにある必要があります。

これらの値をプロジェクト定義ファイルに保存する方法の詳細については、 SQL での変数を使用する をご参照ください。

Executing SQL queries asynchronously

Snowflake CLI lets you execute one or more SQL queries asynchronously. Instead of waiting for a result, the snow sql command schedules the queries at Snowflake and returns a query ID. After a query finishes, you can get the result using the !result query command or the SQL RESULT_SCAN command.

To execute a SQL query asynchronously, end the query with ;> instead of ;, as shown:

snow sql -q 'select "My async query" ;>'
Copy

The following example executes a single query asynchronously:

snow sql -q "select 'This is async query';>"
Copy
select 'This is async query'
+--------------------------------------+
| scheduled query ID                   |
|--------------------------------------|
| 01bc3011-080f-f2d7-0001-c1be14bae7c2 |
+--------------------------------------+

返されたクエリ ID を !result クエリコマンドで使用すると、クエリ結果を表示できます。

snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
Copy
path-to-private-key-file
+-----------------------+
| 'THIS IS ASYNC QUERY' |
|-----------------------|
| This is async query   |
+-----------------------+

また、次に示すように、非同期でも同期でも、クエリ文字列で複数のクエリを実行することもできます。

snow sql -q "select 'This is async query';> select 'Not an async query'; select 'Another async query';>"
Copy
select 'This is async query'
+--------------------------------------+
| scheduled query ID                   |
|--------------------------------------|
| 01bc3b8c-0109-2e81-0000-0f2d0e5a4a32 |
+--------------------------------------+

select 'Not an async query';
+----------------------+
| 'NOT AN ASYNC QUERY' |
|----------------------|
| Not an async query   |
+----------------------+

select 'Another async query'
+--------------------------------------+
| scheduled query ID                   |
|--------------------------------------|
| 01bc3b8c-0109-2e81-0000-0f2d0e5a4a36 |
+--------------------------------------+

SQL クエリコマンドの使用法

Snowflake CLI は、 SQL クエリ内で使用できる次のコマンドを提供します。

  • !source は、ローカルファイルまたは URLs で SQL を実行します。

  • !queries は、すべての SQL クエリをリストします。

  • !result は、 SQL クエリの結果を表示します。

  • !abort は、アクティブな SQL クエリを中止します。

  • !edit, which opens an external editor to modify and execute SQL commands.

Tip

SQL クエリを一重引用符('')ではなく二重引用符("")で囲んだ場合、使用するシェルによっては感嘆符(!)をエスケープする必要があるかもしれません。

ローカルファイルまたは URLs で SQL を実行する

SQL クエリで !source クエリコマンドを使用すると、ローカルファイルまたは URL ベースのファイルで SQL を実行できます。例えば、以下のコマンドは、 my_sql_code.sql という名前のローカルファイル内のすべての SQL コマンドを実行します。

snow sql -q '!source my_sql_code.sql'
Copy

次のように、 !source コマンドを SQL ファイルにネストすることもできます。

select emp_id FROM employees;
!source code_file_2.sql
Copy

この例では、コマンドは SELECT クエリを実行し、 code_file_2.sql ファイル内の SQL コマンドを実行します。!source クエリを実行する前に、 Snowflake CLI は次のことを行います。

  • 変数の置換とテンプレートを評価します。

  • 再帰が発生しないように、ネストされたすべてのファイルの内容を読み込みます。

変数とテンプレートが解決され、再帰が検出されない場合、コマンドは実行のためにコードをSnowflakeに送信します。

注釈

!source クエリの周囲に一重引用符('')ではなく二重引用符("")を使用すると、使用するシェルによっては !\!)をエスケープする必要があるかもしれません。

以下の例は、ソースファイルを実行するさまざまな方法を示しています。

  • ローカルファイルのコードを実行します。

    この例では、ローカルの SQL ファイルに簡単なクエリがあることを想定しています。

    cat code_to_execute.sql
    
    Copy
    select 73;
    

    ファイル内のコードを実行するには、以下のコマンドを入力します。

    snow sql -q '!source code_to_execute.sql'
    
    Copy
    select 73;
    +----+
    | 73 |
    |----|
    | 73 |
    +----+
    
  • URL ベースのファイル内のコードを実行します。

    この例では、 URL の SQL ファイルに同じ簡単なクエリがあると仮定しています。

    ファイル内のコードを実行するには、以下のコマンドを入力します。

    snow sql -q '!source https://trusted-host/trusted-content.sql'
    
    Copy
    select 73;
    +----+
    | 73 |
    |----|
    | 73 |
    +----+
    
  • 変数置換とテンプレートを使用するコードを実行します。

    この例では、ローカルの SQL ファイルにテンプレート変数を使用するクエリがあると仮定しています。

    cat code_with_variable.sql
    
    Copy
    select '<% ctx.env.Message %>';
    

    ファイル内のコードを実行するには、変数値を定義する以下のコマンドを入力します。

    snow sql -q '!source code_&value.sql;' -D value=with_variable --env Message='Welcome !'
    
    Copy
    select 'Welcome !';
    +-------------+
    | 'WELCOME !' |
    |-------------|
    | Welcome !   |
    +-------------+
    

注釈

!source コマンドは、従来の !load エイリアスをサポートしています。

すべての SQL クエリをリスト

!queries クエリコマンドは、アカウントのすべてのクエリをリストします。デフォルトでは、コマンドは現在のセッションで実行された最新の25のクエリをリストします。

例えば、次の !queries クエリコマンドは、特定のユーザーに対する最新の3つのクエリを返します。

snow sql -q '!queries user=user1 amount=3'
Copy
+-------------------------------------------------------------------------------------------------------------------------------------+
| QUERY ID                             | SQL TEXT                                                           | STATUS    | DURATION_MS |
|--------------------------------------+--------------------------------------------------------------------+-----------+-------------|
| 01bc3040-080f-f4f9-0001-c1be14bb603a | select current_version();                                          | SUCCEEDED | 3858        |
| 01bc303d-080f-f4e9-0001-c1be14bb1812 | SELECT SYSTEM$CANCEL_QUERY('01bc3011-080f-f2d7-0001-c1be14bae7c2') | SUCCEEDED | 564         |
| 01bc3011-080f-f2d7-0001-c1be14bae7c2 | select 'This is async query'                                       | SUCCEEDED | 931         |
+-------------------------------------------------------------------------------------------------------------------------------------+

以下のフィルターを使用して、返されるクエリのリストを絞り込むことができます。

フィルター

デフォルト

説明

amount(整数)

25

最近返されたクエリの数(デフォルト:25)。

session (boolean)

N/A

指定されている場合は、現在のセッションで実行されたクエリのみを返します。

warehouse (string)

なし

指定したウェアハウスのみで実行されたクエリを返します。

user (string)

なし

指定したユーザーのみが実行したクエリを返します。

duration(ミリ秒)

0

指定したミリ秒以上のクエリのみを返します。

start_date (string)

なし

指定した日付以降に実行されたクエリのみを返します。日付は ISO 形式で指定されることが期待されます(例: 2025-01-01T09:00:00

end_date (string)

なし

指定した日付より前に実行されたクエリのみを返します。日付は ISO 形式で指定されることが期待されます(例: 2025-01-01T09:00:00

start(整数)

なし

指定したUnixタイムスタンプ(ミリ秒単位)以降に実行されたクエリのみを返します。

end(整数)

なし

指定したUnixタイムスタンプ(ミリ秒単位)より前に実行されたクエリのみを返します。

status(列挙型)

なし

以下のステータスのクエリのみを返します。

  • RUNNING

  • SUCCEEDED

  • FAILED

  • BLOCKED

  • QUEUED

  • ABORTED

type

なし

以下のタイプのクエリのみを返します。

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

  • MULTI_TABLE_INSERT

  • COPY

  • COMMIT

  • ROLLBACK

  • BEGIN_TRANSACTION

  • SHOW

  • GRANT

  • CREATE

  • ALTER

以下の例では、異なるフィルターを使用したクエリを返します。

  • 現在のセッションで実行された最新のクエリ25件を返します。

    snow sql -q 'select 42; select 15; !queries session'
    
    Copy
  • アカウントで実行された最新のクエリ20件を返します。

    snow sql -q '!queries amount=20'
    
    Copy
  • アカウントで実行されたクエリのうち、実行に200ミリ秒以上かかった最新のクエリ20件を返します。

    snow sql -q '!queries amount=20 duration=200'
    
    Copy
  • 指定したウェアハウスで実行された最新のクエリ25件を返します。

    snow sql -q '!queries warehouse=mywh'
    
    Copy

完了した SQL クエリ結果を返す

!result クエリコマンドは、クエリ ID を指定すると、完了したクエリの結果を返します。クエリ ID は以下の方法で取得できます。

snow sql -q '!result 01bc3011-080f-f2d7-0001-c1be14bae7c2'
Copy
+-----------------------+
| 'THIS IS ASYNC QUERY' |
|-----------------------|
| This is async query   |
+-----------------------+

SQL クエリを中止する

!abort クエリコマンドは、そのクエリ ID が指定されると、アクティブなクエリを中止します。クエリ ID は以下の方法で取得できます。

snow sql -q '!abort 01bc3011-080f-f2d7-0001-c1be14bae7c2'
Copy
+-------------------------------------------------------------+
| SYSTEM$CANCEL_QUERY('01BC3011-080F-F2D7-0001-C1BE14BAE7C2') |
|-------------------------------------------------------------|
| Identified SQL statement is not currently executing.        |
+-------------------------------------------------------------+

Open an external editor to modify and execute SQL commands

The !edit query command opens an external editor where you can modify SQL commands to execute when you exit the editor. The editor is specified in the EDITOR environment variable or, if the environment variable is not set, the default system editor is used.

外部エディターでコマンドを入力するには、次の手順に従います。

  1. シェルでまだ定義されていない場合は、EDITOR 環境変数をお好みのテキストエディターに設定します。

  2. snow SQL コマンドを入力します。

    snow sql
    
    Copy
  3. > プロンプトで:codenowrap:!edit コマンドを入力します。

    > !edit
    
    Copy

    コマンドは、指定されたテキストエディターを開きます。

  4. 次のように、エディターに SQL コマンドを入力します。

    SELECT current_user() ;
    
    Copy
  5. ファイルを保存し、エディターを終了します。

    入力したコマンドは次のように表示されます。

    ✓ Edited SQL loaded into prompt. Modify as needed or press Enter to execute.
    > select current_user();
    
  6. コマンドを実行するには、ENTER を選択します。

    コマンド出力は以下のように表示されます。

    +----------------+
    | CURRENT_USER() |
    |----------------|
    | USER1          |
    +----------------+
    

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 -c patcli -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 コマンドの入力

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 と入力します。